フラクタル

フラクタル(英: fractal)は、フランスの数学者ブノワ・マンデルブロが導入した幾何学の概念です。 図形の部分と全体が自己相似になっているものなどをいいます。

フラクタルの作成方法は反復計算などを使います。シンプルな計算式で綺麗なフラクタルを作成できます。

1. コッホ曲線(Koch curve)の例

まず、コッホ曲線の例でフラクタルの作成方法を勉強します。

コッホ曲線を作成するめに、上記の作業の中の繰り返している部分を考えます。

繰り返している作業: 

Step 1 線分の3等分

与えられる線分を以下の配列で表示します。

$$ \left[ \begin{array}{cc}x1 & y1 \\ x2 & y2 \end{array} \right] $$

3等分後の節点は4になりますが、これを以下のように表示します。

$$ \left[ \begin{array}{cc}x1 & y1 \\ x3 & y3 \\ x4 & y4 \\ x2 & y2 \end{array} \right] $$

新しい節点の座標は次のように計算できます。

$$x3=\frac{2}{3} x_1 + \frac{1}{3} x_2, \quad y3=\frac{2}{3} y_1 + \frac{1}{3} y_2 $$$$x4=\frac{1}{3} x_1 + \frac{2}{3} x_2, \quad y4=\frac{1}{3} y_1 + \frac{2}{3} y_2 $$

以下のOctaveのコードを参考してください。

上記のコードに作られているnode_listを描画するために、以下の関数を作ります。

演習1

以下の線分について、3等分を取って、上記の作業に従って新しい点のリストを作ってください。

1.2 正三角形の2つ辺を描く

与えられる線分を1辺とする正三角形を考えます。 線分のデータは以下の形を持っています。

$$ \left[ \begin{array}{cc}x1 & y1 \\ x2 & y2 \end{array} \right] $$

指定される正三角形の(x1,y1),(x2,y2)の以外の頂点(x3,y3)を以下のように算出できます。

即ち、

$$ \left( \begin{array}{c} x3\\ y3 \end{array} \right) =\left( \begin{array}{cc} \cos \theta & - \sin \theta \\ \sin \theta & \cos \theta \end{array} \right) \left( \begin{array}{c} x2-x1\\ y2-y1 \end{array} \right) + \left( \begin{array}{c} x1\\ y1 \end{array} \right) $$

関数で作業をまとめます

上記の作業をまとめて、関数create_triangleを定義します。

関数 create_triangleを使って、三角形の2辺を作成します。

演習2

上記の作業に従って、線分から三角形を作ってください。

1.3 三等分と三角形作成のコードのまとめ

与えられる線分(node_listで表す)について、三等分と三角形作成の作業を update_line にまとめます。

演習3

以下の幾つかの線分を update_line で処理して、その結果を確認しなさい。

1.4 複数線分の処理

node_listに格納される各点と次ぎの点がなす線分をupdate_lineで処理します。各線分から得られる新しい4つの線分をnew_node_listに入れて、新しい点のリストが作られます。

演習4

以下の線分処理の回数(N)を順番に1,2,3,4,5にしてから結果を確認してください。

1.6 コードのまとめ

演習 5

初期の点のリストを正三角形の頂点について、上記のupdate_node_listで処理してみてください。

正三角形の頂点の座標:

$$ (0,0), (1/2,\sqrt{3}/2), (1,0) $$

レポート課題

Minkowski Sausageのフラクタルは以下のような反復計算を使っています。 コッホ曲線の計算コードを参考して、Minkowski Sausageのフラクタルを作ってください。

以下は正方形から作ったMinkowski Sausageの図です。

ヒント

以下の作業の流れに従って、Minkowski Sausageに必要な線分の変形ができます。

Step 1

線分の2つの節点を$p_1=(x1,y1),p_2=(x2,y2)$とします。$p_1$を始点にして、$p_1p_2$線分上$|p1p3|=1/\sqrt{5}$を満たす$p_3$は以下の式で算出できます。

$$ p3 = p1 + \frac{1}{\sqrt{5}} \frac{(p2-p1)}{|p2-p1|} $$

Step 2

$p_1$を中心にしてベクトル$p_1p_3$を時計回り$\theta$角度で回転します。ただし、$\theta$は以下ように算出されます。 $$ \theta = \sin^{-1}(\frac{1}{\sqrt{5}}) $$

Step 3

線分$p_1p_2$の上の点$p_4$を描く。