Koch Curve

What

フラクタル(自己相似)で有名なコッホ曲線です。フラクタルとは、画像をそのまま縮小したものが、元の画像の一部に含まれているというものです。
複雑な海岸線などに現れるパターンで、数学的に詳しく研究がなされています。実際にプログラムを書く際には画面の解像度に限界があるのでループ を5回で止めていますが、フラクタル自体は無限に細かくなっています。
画面をクリックすると再び直線から始まります。

How


var w = 800;
var h = 300;
var lines = [[0,h - 10, w, h - 10]];
var newLines = [];
function setup() {
  createCanvas(w, h);
  background(255);//white
  frameRate(1);
  strokeWeight(0.5);
}

function draw() {
  background(255);
  console.log(lines.length);
  for(i = 0; i < lines.length; i++){
    line(lines[i][0],lines[i][1],lines[i][2],lines[i][3]);
    lineParts = createLines(lines[i]);
    for(j = 0; j< lineParts.length; j++){
      newLines.push(lineParts[j]);
    }
  }
  lines = newLines;
  newLines = [];
  if(frameCount === 8){
    noLoop();
  }
}

function createLines(l){
  var a = l[0];
  var b = l[1];
  var c = l[2];
  var d = l[3];
  var v1 = (c - a) / 3;
  var v2 = (d - b) / 3;
  var u1 =  v1 * cos(-PI / 3) - v2 * sin(-PI / 3);
  var u2 =  v1 * sin(-PI / 3) + v2 * cos(-PI / 3);
  var l1 = [a, b, a + v1, b + v2];
  var l2 = [a + v1,  b + v2, a + v1 + u1, b + v2 + u2];
  var l3 = [a + v1 + u1, b + v2 + u2, a + v1 * 2, b + v2 * 2];
  var l4 = [a + v1 * 2, b + v2 * 2, c, d];
  return [l1, l2, l3, l4];
}

function mousePressed(){
  lines = [[0,h - 10, w, h - 10]];
  newLines = [];
  loop();
}