[Pythonによる科学・技術計算]フラクタル図形の描画 [シェルピンスキーの三角形，バーンスレーのシダ、フラクタル木]

#はじめに
**Pythonを利用して典型的なフラクタル図形(らしい)として知られている**

**1. シェルピンスキーの三角形**
**2. バーンスレーのシダ**
**3. フラクタル木**

**を描く。**

ここではフラクタル幾何学の数理を述べない(著者が当該分野について浅学なため，という理由)。
ただ，**簡単なルールから自然に見られるフラクタル図形が生成されていく様子**をみることを楽しんでもらえれば幸いである。

***

#内容
##(1) シェルピンスキーの三角形


**貝殻など海の生物のパターンにみられる模様である。**以下の簡単な規則で作られた点の集合を描く。

```
1.  以下の3つの頂点の座標を持つ正三角形を描く。
頂点1: (x1,y1)
頂点2: (x2,y2)
頂点3: (x3,y3)

2. 三角形の内部の任意の点P(x_0,y_0)を最初の点とする。
3. 新しい点を以下のようにして定める。
    Pと頂点1の中点に点PPを描く (1/3の確率)
    Pと頂点2の中点に点PPを描く (1/3の確率)
    Pと頂点3の中点に点PPを描く (1/3の確率)
4. 3を繰り返す
```

##(2) バーンスレーのシダ

**シダ植物のような模様を描く。**ランダムな要素から高い対称性を持つシダができることはオドロキである。
(1)のシェルピンスキーの三角形を作る規則2において，
$(x_n,y_n)$からあたらしい点$(x_{n+1},y_{n+1})$を生成する規則を以下のように変更する。

$r$を[0,1]の一様乱数とし，

$(x_{n+1},y_{n+1}) = $
$(0.5, 0.27 y_n)  \  \ (r<0.02)$
$(-0.139 x_n+0.263 y_n +0.57, 0.246 x_n + 0.224 y_n - 0.036)   \  \ (0.02\leqq r<0.17)$
$(0.17x_n-0.215 y_n+0.408, 0.222 x_n+0.176 y_n +0.0893)  \  \ (0.17\leqq r<0.3)$
$(0.781 x_n + 0.034 y_n +0.1075, -0.032 x_n + 0.739 y_n + 0.27  \  \ (0.03\leqq r\leqq1)$

としする。

##(3)フラクタル木
**木の模様を生成する。**

1)のシェルピンスキーの三角形を作る規則2において，
$(x_n,y_n)$からあたらしい点$(x_{n+1},y_{n+1})$を生成する規則を以下のように変更する。


$(x_{n+1},y_{n+1}) = $
$(0.05, 0.6 y_n)$   (確率10%)
$(0.05x_n,-0.5 y_n+1.0 $  (確率10%)
$(0.46x_n-0.15 y_n,0.39 x_n+0.38 y_n+0.6 $  (確率20%)
$(0.47x_n-0.15 y_n,0.17 x_n+0.42 y_n+1.1 $  (確率20%)
$(0.43x_n+0.28y_n,-0.25x_n+0.45y_n+1.0$  (確率20%)
$(0.42x_n+0.26y_n,-0.35x_n+0.31y_n+0.7$  (確率20%)





***

#コード(1): シェルピンスキーの三角形
```py3

"""
シェルピンスキーの三角形

"""


import numpy as np
import matplotlib.pyplot as plt
from random import random, randrange
from math  import floor


fig=plt.figure()
anim=[]
#
a=np.zeros([3])
b=np.zeros([3])


X1,Y1=0,5
X2,Y2=5,0
X3, Y3=-5,0 

a[0], a[1], a[2] =X1, X2, X3
b[0],b[1], b[2]= Y1, Y2, Y3

plt.plot(a[0],b[0],'o',color='blue',markersize=1)
plt.plot(a[1],b[1],'o',color='blue',markersize=1)

plt.plot(a[2],b[2],'o',color='blue',markersize=1)

x=2.5
y=2.5
for i in range(15000):メインループ: 生成規則(1)
    if i%1000 ==0:
        print(i)

    n=randrange(3)
    x=(x+a[n])/2
    y=(y+b[n])/2
    plt.plot(x,y,'o',color='blue',markersize=1)

plt.show()

```

#結果(1):シェルピンスキーの三角形

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/42f431d5-4942-82d1-5b1a-277305bcb317.png)


どの部分を見ても自己相似になっている。


***


```py3
"""
バーンスレーのシダ
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation # アニメーション作成のためのメソッドをインポート
from random import random, randrange
from math  import floor


fig=plt.figure()
anim=[]
#

x=0.5
y=0.5
for i in range(15000):メインループ: 生成規則(2)
    if i%1000==0:
        print(i)
    
    r=random()
    if r< 0.02:
        x,y = 0.5, 0.27*y
    
    elif 0.02 <= r <=0.17:
        x,y =  -0.139*x+0.263*y+0.57, 0.246*x+0.224*y-0.036
    
    elif 0.17 < r <=0.3:
        x,y = 0.17*x-0.215*y+0.408, 0.222*x+0.176*y+0.0893
    
    elif 0.3 < r <= 1:
        x,y = 0.781*x+0.034*y+0.1075, -0.032*x+0.739*y+0.27
    
    
    plt.plot(x,y,'o',color='blue',markersize=1)

plt.show()

```

***
#結果(2):バーンスレーのシダ

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/b7125199-f998-9e0e-e3dc-92f9c81c90d3.png)

葉っぱを拡大すると同じ構造が含まれている(自己相似性)。
ただ，枝だと葉の違いがあることからもわかるように，シダの全体は自己相似性をもたない。

***



```py3

"""
フラクタル木
13Aug. 2017
"""


import numpy as np
import matplotlib.pyplot as plt
from random import random, randrange
from math  import floor


fig=plt.figure()
anim=[]
#

x=0.5
y=0.5
for i in range(15000): メインループ: 生成規則(3)
    if i%1000==0:
        print(i)
    
    r=random()
    if r<= 0.1:
        x,y = 0.05, 0.6*y
    
    elif 0.1 < r <=0.2:
        x,y =  -0.05*x, -0.5*y+1.0
    
    elif 0.2 < r <=0.4:
        x,y = 0.46*x-0.15*y, 0.39 *x+0.38*y+0.6
    
    elif 0.4 < r <= 0.6:
        x,y = 0.47*x-0.15*y, 0.17*x+0.42*y+1.1
        
    elif 0.6 < r <= 0.8:
        x,y = 0.43*x+0.28*y, -0.25*x+0.45*y+1.0
        
    elif 0.8 < r <= 1.0:
        x,y = 0.42*x+0.26*y, -0.35*x+0.31*y+0.7
        
    
    plt.plot(x,y,'o',color='blue',markersize=1)
   # anim.append(im)

plt.show()


```


***
#結果(3): フラクタル木

![tt.png](https://qiita-image-store.s3.amazonaws.com/0/192457/96918deb-a471-9909-9674-9c2c2675dc65.png)

***

#補遺
●  フラクタル幾何は非整数次元を持つ([フラクタル次元](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%AB%E6%AC%A1%E5%85%83))。この次元の定義はさまざまなものがあるようである。ハウスドルフ・ベシコビッチによる定義[1]はそのなかでも分かりやすいと思う。直線を1次元，三角形が2次元， 立体が3次元として，対称とする図形のフラクタルとしての次元を決定する。

● バーンスレーのシダもフラクタル木も，数学的には点集合が[自己アフィン性](https://banana.cite.tohoku.ac.jp/topics/fractals/self-affine/self-affine.html)を持つ変換によって生成されている[2]。これによって自己相似性が生じている(らしい)。

***

参考文献


[1]奥村 善英 (静岡大学 理学部 数学科)  氏による[pdf]( http://www.sci.shizuoka.ac.jp/~math/math/contents/kiroku/Guide/fractdim.pdf)

[2]早川 美徳 (東北大学 教育情報基盤センター メディア教育部門)氏による[解説ページ](https://banana.cite.tohoku.ac.jp/topics/fractals/self-affine/self-affine.html)