Mod:Coding Challenge #77: Recursion
今回は再帰について。
関数のなかで実行される命令に条件を書いて、その条件を満たす範囲において関数が関数自身を実行するというもの。ウロボロスの🐍っぽいイメージ。永遠に実行されてしまうことを防ぐために条件が必要。今回は半径を小さくしつつ中心座標を上下左右にずらしながら円/円周上の点をつなぐ三角形を描く。三角形の頂点計算は割と雑に書いている。
描画する図形を三角形にして回転するようにすると随分違うものになった。結構気に入っている。
コード
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); } }