surolog

AI・機械学習・データ分析 と 本 など

(メモ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();
}

記述はこれだけです。

  1. ランダムウォーカークラスを定義
  2. setup()で画面中央に配置
  3. update()で座標をランダムに1point変化
  4. display()で描画

あとは3.4をdraw()で繰り返す

この結果、下のようにランダムウォークの軌跡が残ります。

f:id:sator926:20141226160135g:plain

これだけでなんだかおもしろいですよね。
おまけとして、乱数の生成に使用した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]);
  }
}

f:id:sator926:20150114003644g:plain

せば