フラクタル

コッホ雪片

デモ

クリックで再描画

原理

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;
      }
    }