フラクタル(I)

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

フラクタルの作成では反復計算などを使っています。フラクタルの特徴の一つは、シンプルな計算式で綺麗なフラクタルを作成することができます。

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

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

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

繰り返している作業: 

Step 1 線分の3等分

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

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

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

$$ \left[ \begin{array}{cc}x1 & x3 & x4 & x2 \\ y1 & y3 & y4 & 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 $$

例1

与えられる線分の3等分を算出するPythonのコード例

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

演習1

例1のコードを関数divide_lineに変形して、以下の二つの線分の3等分を取って、新しい節点のリストを描いてください。

1.2 線分から正三角形を作成

与えられる線分をベースにして、その線分を一つの辺とする正三角形の作成を考えます。

線分のデータは以下の形を持っています。

$$ \left[ \begin{array}{cc}x1 & x2 \\ y1 & 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) $$

計算した新しい節点を使って、以下の新しい節点のリストを作成します。

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

関数で作業をまとめます

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

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

演習2

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

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

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

2点の線分を更新して、新しい節点のリストを作成し、グラフを描きます。

演習3

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

1.4 複数節点のリストの処理

以下の関数update_nodes_listはnode_listに格納される各点と次ぎの点がなす線分をupdate_two_node_listで処理します。

各線分から得られる新しい4つの線分の節点をnew_node_listに入れて、新しい点のリストを作成します。

節点の計算では、となりの二つの線分は同じ節点を共有しているので、new_node_listを更新するとき、節点が重複しないように注意してください。

演習4

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

1.6 コードのまとめ

レポート課題 1

初期の線分のリストを正三角形の三つの辺として、上記のupdate_node_listで処理してみてください。

正三角形の頂点の座標:

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

レポート課題2 (オプション)

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$を描く。