フラクタル
コッホ雪片
デモ
クリックで再描画
原理
Wikipediaが詳しい(https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%83%E3%83%9B%E6%9B%B2%E7%B7%9A)
要するに、時刻\(t+1\)における状態は、時刻\(t\)における各線分を4つの線分で置き換えることで得られるので、tに関して無限に繰り返せばよい。
1つの線分から4つの線分を得る方法は以下の通り。
実装
上の通りに書くだけ
class Koch {
public Koch(float x1, float y1, float x2, float y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public float x1, y1, x2, y2;
public ArrayList getChildren() {
ArrayList res = new ArrayList();
float p1x = (2 * x1 + x2) / 3;
float p1y = (2 * y1 + y2) / 3;
Koch k1 = new Koch(x1, y1, p1x, p1y);
float p2x = x1 + (x2 - x1) / 2 - sqrt(3) * (y2 - y1) / 6;
float p2y = y1 + (y2 - y1) / 2 + sqrt(3) * (x2 - x1) / 6;
Koch k2 = new Koch(p1x, p1y, p2x, p2y);
res.add(k1);
res.add(k2);
float p3x = (2 * x2 + x1) / 3;
float p3y = (2 * y2 + y1) / 3;
Koch k3 = new Koch(p2x, p2y, p3x, p3y);
Koch k4 = new Koch(p3x, p3y, x2, y2);
res.add(k3);
res.add(k4);
return res;
}
}