日常の進捗

主に自分のための,行為とその習慣化の記録

Mod:Coding Challenge #77: Recursion

f:id:takawo:20171006102355g:plain

今回は再帰について。

関数のなかで実行される命令に条件を書いて、その条件を満たす範囲において関数が関数自身を実行するというもの。ウロボロスの🐍っぽいイメージ。永遠に実行されてしまうことを防ぐために条件が必要。今回は半径を小さくしつつ中心座標を上下左右にずらしながら円/円周上の点をつなぐ三角形を描く。三角形の頂点計算は割と雑に書いている。

描画する図形を三角形にして回転するようにすると随分違うものになった。結構気に入っている。

コード

float x;
float y;
float d = 300;

// setup関数 : 初回1度だけ実行される
void setup() {
  size(600, 600, P2D); // ウィンドウサイズを960px,540pxに
  blendMode(ADD);
  colorMode(HSB, 360, 100, 100, 100); // HSBでの色指定にする
  smooth(32); // 描画を滑らかに
  x = 0;
  y = 0;
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  background(0, 0, 0);
  translate(width/2,height/2);
  rotate(frameCount * -0.01);
  drawTriangle(x, y, d);
}

void drawTriangle(float x, float y, float d) {
  noFill();
  stroke(0.25 * abs(d+x+y*width)%360, 80, 100, min(d*2, 100));
  strokeWeight(d*0.1);
  pushMatrix();
  translate(x, y);
  beginShape();
  for (float angle = 0; angle < 360; angle += 360 / 3) {
    float theta =radians(angle);
    float x2 = cos(theta + PI/6 + 0.00001 * abs(d+x+y*width)+frameCount * 0.01) * d/2;
    float y2 = sin(theta + PI/6 + 0.00001 * abs(d+x+y*width)+frameCount * 0.01) * d/2;
    vertex(x2, y2);
  }
  endShape(CLOSE);
  popMatrix();
  if (d > 5) {
    drawTriangle(x + d * 0.5, y, d * 0.5);
    drawTriangle(x - d * 0.5, y, d * 0.5);
    drawTriangle(x, y - d * 0.5, d * 0.5);
    drawTriangle(x, y + d * 0.5, d * 0.5);
  }
}

リファレンス