(メモ1)Processingでランダムウォークを可視化
NATUREofCODE
processingを用いたプログラミングの書籍として、「NATUREofCODE」というとてもおもしろいものがあります。ざっくりいうとprocessingを使って物理シミュレーションを行う内容なのですが、高校の物理の教科書に出てくるような簡単な物理法則の式を実装・適用するだけで、驚くほど生き生きと物体をシミュレートすることができます。
勉強をかねて、コードを実装していきます。
ランダムウォーク
まずは様々な方向にランダムに移動する粒子を実装します。
私が思うこの本のおもしろいところは、プログラムに積極的にランダム性を取り入れて
その結果生まれる現象を考察している(あるいはただ楽しんでいる)点だと思います。
実際、ランダムな動きから生まれるビジュアルはとても美しく、飽きずに見て入られます。
ランダムウォークはこのランダム性の基本となるものです。早速コードを見ていきます。
//ランダムウォーカークラス class walker { int x; int y; walker(){ x = width/2; y = height/2; } void display(){ stroke(0); point(x,y); } void step(){ int choice = int(random(4)); if(choice == 0){ x++; } else if(choice == 1){ x--; } else if(choice == 2){ y++; } else { y--; } } } walker w; void setup(){ size(640,360); w = new walker(); background(255); } void draw(){ w.step(); w.display(); }
記述はこれだけです。
- ランダムウォーカークラスを定義
- setup()で画面中央に配置
- update()で座標をランダムに1point変化
- display()で描画
あとは3.4をdraw()で繰り返す
この結果、下のようにランダムウォークの軌跡が残ります。
これだけでなんだかおもしろいですよね。
おまけとして、乱数の生成に使用したrandom()関数の挙動を見てみます。
random()関数は指定した個数の乱数を一様に発生させますが、その様子が見て取れると思います。
int[] randomCounts; void setup(){ size(500, 300); randomCounts = new int[20]; } void draw(){ background(255); int index = int(random(randomCounts.length)); randomCounts[index]++; stroke(0); fill(175); int w = width/randomCounts.length; for(int x=0 ; x < randomCounts.length ; x++){ rect(x*w, height-randomCounts[x], w-1, randomCounts[x]); } }
せば