フラクタル

計算機演習A,B 2021年7月19日 担当教員: 劉 雪峰

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

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

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

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

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

繰り返している作業: 

Step 0: 準備:節点の描画

まず、与えられる節点のリストを描画する関数draw_node_listを作成します。

Step 1: 線分の3等分による節点を追加する

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

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

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

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

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

$$p3=\frac{2}{3} p_1 + \frac{1}{3} p_2,~ \quad p4=\frac{1}{3} p_1 + \frac{2}{3} p_2. $$

例1

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

Step 2: 線分の回転による節点を追加する

線分$p_3p_4$を利用して、$p_5$を作成します。具体的な操作については、$p_4$を$p_3$を中心にして、反時計回りに$\theta=\pi/3$回転します。

即ち、

$$ p5 =\left( \begin{array}{cc} \cos \theta & - \sin \theta \\ \sin \theta & \cos \theta \end{array} \right) (p4-p3) + p3 \quad (\theta = \frac{\pi}{3}) $$

節点$p3$, $p4$, $p5$を使って、以下の新しい節点のリストを作成します。

$$ \left[ \begin{array}{ccccc}x1 & \color{red}{x3} & \color{blue}{x5} & \color{red}{ x4 } & x2 \\ y1 & \color{red}{ y3 } & \color{blue}{x5} & \color{red}{ y4 } & y2 \end{array} \right] $$

Step 3: 結果の確認

更新した節点のリストを描画します。

節点作成のコードのまとめ

与えられる線分(node_listで表す)について、節点の作業をadd_nodesにまとめます。また、節点リストの描画関数draw_node_listもここに書いておきます。

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

演習1

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

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

以下の関数update_node_listは、node_listに格納された各点と次の点がなす線分をadd_nodesで処理します。

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

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

演習2

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

1.5 コードのまとめ

レポート課題1

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

正三角形の頂点の座標:

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

また、add_nodesの関数では、新しい節点の作成方法(角度、線分の長さなど)を試み、新しいフラクタルを作成して、自分の「家」の飾りとして活用してください。

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

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

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

ヒント

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

Step 1

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

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

Step 2

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

Step 3

$p_1p_2$線分上で$|p_2p_4|=|p_1p_2|/\sqrt{5}$を満たす$p_4$を算出します。

$p_2$を中心にして、ベクトル$p_2p_4$を時計回りに角度$\theta$回転します。