原子のような粒子間の引力または反発の単純な規則を使用して原始的な人工生命をシミュレートする単純なプログラムで、複雑な自己組織化生命のようなパターンを生成します。 GUI 要素を除けば、コードは 1 ページ未満です。ビデオチュートリアルとウォークスルーは以下から入手できます。
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 行です。残りは、オープンソースの使いやすい画像レンダリング ライブラリである openFrameworks ライブラリによって提供される 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 の Clusters http://www.ventrella.com/Clusters/ からインスピレーションを受けました。私は Ventrella のコードにアクセスできませんが、このプロジェクトが他のパーティクル ライフ プロジェクトと大きく異なるのは、衝突検出を実装していないことと、これにより数千のパーティクルのリアルタイム シミュレーションが可能になったことだと思います。また、リアルタイムでパラメータを変更するための GUI コントロールを追加し、簡単な微調整と探索を可能にしたため、非常に単純な関係モデルから、これまでに見たことのないパターンが出現することを見つけることができました。ここのコードは、おそらく他のどの人工生命コードよりも一桁単純です。なぜなら、このコードは、単純さから複雑さが生じる可能性があることを証明するために、非プログラマーおよび一般読者向けの教材としてのみ開始したからです。