원자와 같은 입자 사이의 인력 또는 반발에 대한 간단한 규칙을 사용하여 원시적인 인공 생명체를 시뮬레이션하여 복잡한 자기 조직 생명체와 같은 패턴을 생성하는 간단한 프로그램입니다. GUI 요소를 제외하면 코드는 한 페이지 미만입니다. 비디오 튜토리얼과 연습은 아래에서 볼 수 있습니다.
https://youtu.be/0Kx4Y9TVMGg
라이브 데모를 보려면 여기를 클릭하십시오(JavaScript):
이러한 패턴을 재현하기 위해 매개변수가 정확할 필요는 없습니다. 흥미로운 패턴을 얻는 가장 좋은 방법은 먼저 무작위 매개변수 탐색을 시도하고, 일단 흥미로운 패턴을 찾으면 점차적으로 미세 조정해 보는 것입니다. 로컬 최대값에 갇히는 것을 방지하려면 가끔 큰 매개변수 점프를 수행할 수 있습니다. 이런 식으로 흥미롭고 다양한 패턴이 계속해서 나타날 것입니다.
이 저장소를 다운로드하세요. 파일의 압축을 푼 다음 /particle_life/bin/ 폴더로 이동하여 Particle_life.exe를 클릭합니다.
소스 코드는 C++, JavaScript 및 Python으로 제공됩니다. 연습 튜토리얼을 보려면 이 YouTube 비디오를 시청하세요: https://youtu.be/0Kx4Y9TVMGg
C++ 프로그램에 기여하고 싶다면 핵심 알고리즘은 "/particle_life/src/ofApp.cpp"에 있는 코드의 처음 100줄입니다. 나머지는 오픈프레임웍스 라이브러리(오픈소스 및 사용하기 쉬운 이미지 렌더링 라이브러리)에서 제공되는 GUI 구성 요소 및 렌더링 컨트롤입니다.
시작하려면 이 저장소를 다운로드한 다음 https://openframeworks.cc/에서 openFrameworks 라이브러리를 다운로드하세요. openFramework의 projectGenerator를 사용하여 /particle_life/ 폴더를 프로젝트로 가져옵니다.
또는 새로운 openFramework 프로젝트를 생성하고 ofxGui를 추가하세요. 프로젝트 파일이 생성되면 /src/ 폴더를 여기에 제공된 폴더로 바꾸세요.
이제 컴퓨터에서 C++ 코드를 컴파일할 수 있습니다.
또한 더 최적화된 버전을 보려면 Particle_life.html 파일을 살펴보세요. 기여해주신 분들께 감사드립니다.
< canvas id =" life " width =" 500 " height =" 500 " > </ canvas >
< script >
//Hunar Ahmad @ brainxyz
m = document . getElementById ( "life" ) . getContext ( "2d" ) ;
draw = ( x , y , c , s ) => {
m . fillStyle = c ;
m . fillRect ( x , y , s , s ) ;
} ;
atoms = [ ] ;
atom = ( x , y , c ) => {
return { x : x , y : y , vx : 0 , vy : 0 , color : c } ;
} ;
random = ( ) => {
return Math . random ( ) * 400 + 50 ;
} ;
create = ( number , color ) => {
group = [ ] ;
for ( let i = 0 ; i < number ; i ++ ) {
group . push ( atom ( random ( ) , random ( ) , color ) ) ;
atoms . push ( group [ i ] ) ;
}
return group ;
} ;
rule = ( atoms1 , atoms2 , g ) => {
for ( let i = 0 ; i < atoms1 . length ; i ++ ) {
fx = 0 ;
fy = 0 ;
for ( let j = 0 ; j < atoms2 . length ; j ++ ) {
a = atoms1 [ i ] ;
b = atoms2 [ j ] ;
dx = a . x - b . x ;
dy = a . y - b . y ;
d = Math . sqrt ( dx * dx + dy * dy ) ;
if ( d > 0 && d < 80 ) {
F = ( g * 1 ) / d ;
fx += F * dx ;
fy += F * dy ;
}
}
a . vx = ( a . vx + fx ) * 0.5 ;
a . vy = ( a . vy + fy ) * 0.5 ;
a . x += a . vx ;
a . y += a . vy ;
if ( a . x <= 0 || a . x >= 500 ) { a . vx *= - 1 ; }
if ( a . y <= 0 || a . y >= 500 ) { a . vy *= - 1 ; }
}
} ;
yellow = create ( 200 , "yellow" ) ;
red = create ( 200 , "red" ) ;
green = create ( 200 , "green" ) ;
update = ( ) => {
rule ( green , green , - 0.32 ) ;
rule ( green , red , - 0.17 ) ;
rule ( green , yellow , 0.34 ) ;
rule ( red , red , - 0.1 ) ;
rule ( red , green , - 0.34 ) ;
rule ( yellow , yellow , 0.15 ) ;
rule ( yellow , green , - 0.2 ) ;
m . clearRect ( 0 , 0 , 500 , 500 ) ;
draw ( 0 , 0 , "black" , 500 ) ;
for ( i = 0 ; i < atoms . length ; i ++ ) {
draw ( atoms [ i ] . x , atoms [ i ] . y , atoms [ i ] . color , 5 ) ;
}
requestAnimationFrame ( update ) ;
} ;
update ( ) ;
</ script >
입자 생명 시뮬레이션, 원시 수프 - 진화, 콘웨이의 생명 게임, 세포 오토마타, 자가 조직 패턴,
이 프로젝트는 Jeffery Ventrella의 클러스터 http://www.ventrella.com/Clusters/에서 영감을 받았습니다. 나는 Ventrella의 코드에 접근할 수 없지만 다른 입자 수명 프로젝트와 이 프로젝트의 주요 차이점은 충돌 감지를 구현하지 않았으며 이로 인해 수천 개의 입자를 실시간으로 시뮬레이션할 수 있다는 것입니다. 또한 실시간으로 매개변수를 변경하는 GUI 컨트롤을 추가하여 쉽게 미세 조정하고 탐색할 수 있도록 했으며, 따라서 매우 간단한 관계 모델에서 이전에 볼 수 없었던 패턴이 나타나는 것을 발견할 수 있었습니다. 여기에 있는 코드는 아마도 다른 인공 생명 코드보다 훨씬 더 단순할 것입니다. 왜냐하면 저는 이 코드를 프로그래머가 아닌 사람과 일반 청중을 위한 교육 자료로만 시작하여 단순성에서 복잡성이 발생할 수 있다는 점을 증명하기 때문입니다.