日常の進捗

行為と記録とその習慣化

Mod:Coding Challenge #14: Fractal Trees - Recursive

再帰(リカーシブ)関数による樹木の描画。再帰は最初の頃、イメージつかめなかったけど、作った関数Aが関数A自体を所定の条件の中で呼び出すというもの。これだとbranchという関数が実行されて、基準となる原点座標を移動させながら枝分かれするように2つのbranchが実行され、更にそこで2つに枝分かれして、更に・・・という感じ。

メニュー>ファイル>サンプル>“Fractals and L-Systems"のTreeとかがまんまこれっぽいサンプルだったと思う。見たところあと数回は続くっぽいのでこれくらいにしておく。

// setup関数 : 初回1度だけ実行される
void setup() {
  size(960, 540); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100); // HSBでの色指定にする
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  background(220, 20, 20);
  stroke(0, 0, 100);
  translate(width/2, height);
  branch(100, 12);
}

void branch(float len, int depth) {
  float theta = map(mouseX, 0, width, -PI/2, PI/2);
  float ratio = map(mouseY, 0, height, 0.5, 0.9);
  strokeWeight(depth);
  if (depth > 0) {
    line(0, 0, 0, -len);

    pushMatrix();
    translate(0, -len);
    rotate(theta);
    branch(len * ratio, depth-1);
    popMatrix();

    pushMatrix();
    translate(0, -len);
    rotate(-theta);
    branch(len * ratio, depth-1);
    popMatrix();
  }
}

リファレンス