gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

ノイズ木構造

再帰関数で二分木をどわーっと書いて、点をノイズで揺らしてみました。僕の好きなノイズと再帰でごり押しした感じの作品ですが、動的に生成される木構造が良いですね。本当はノードが増えたり減ったりしたときに、辺をニョキッと滑らかに生やしたかったんですが、やり方がよく分かりませんでした。。

コードは以下の通りです。最初の一回だけ、nowDeepが0なので、map(i,0,0,0,360)となってこれはinfinityを返すぞ!と怒られますが、気にしない気にしない。

PIC10 p10=new PIC10();
void setup(){
  size(1200,600,P2D);
  smooth();
  
}

void draw(){
  background(0);
  p10.move(width/2,10,0);
}

class PIC10 {
  int nowDeep=0; //現状の最大の再帰の深さ
  PIC10() {
  }

  void move(float x, float y, int i) {
    float noi=200*noise(100*i+frameCount/700.0);  //横の節との間隔
    float noitate=200*noise(1000*i+frameCount/700.0);  //縦の節との間隔
    if (y+noitate>=height-20) {  //画面に収まる範囲で再帰をする
      fill(map(i, 0, nowDeep, 0, 360), 100, 100);
      ellipse(x, y, 10, 10);
      nowDeep=i;  //再帰を打ち切る際にnowDeepを更新
      return;
    }

    colorMode(HSB, 400, 100, 100);
    fill(map(i, 0, nowDeep, 0, 360), 100, 100);
    ellipse(x, y, 10, 10);
    stroke(0,0,100);
    line(x, y, x+noi, y+noitate);
    line(x, y, x-noi, y+noitate);
    move(x+noi, y+noitate, i+1);
    move(x-noi, y+noitate, i+1);
  }
}