#1.フラクタル図形とは
フラクタル図形とは,どんなに拡大しても元々の図形と同じであるもの.
フラクタル図形の代表的なものであるシェルピンスキーのギャスケットを以下に示す.
#2.シェルピンスキーのギャスケットの作成
fractal.py
import matplotlib.pyplot as plt
import matplotlib.patches as pat
import math
#triangle = [(x1,y1),(x2,y2),(x3,y3)]
#入力triangle内にある三角形の座標を出力する
def return_triangle(triangle):
x1 = (triangle[0][0] + triangle[1][0])/2
y1 = (triangle[0][1] + triangle[1][1])/2
x2 = (triangle[1][0] + triangle[2][0])/2
y2 = (triangle[1][1] + triangle[2][1])/2
x3 = (triangle[2][0] + triangle[0][0])/2
y3 = (triangle[2][1] + triangle[0][1])/2
new_triangle = [(x1,y1),(x2,y2),(x3,y3)]
return new_triangle
#2点間の距離を出力する
def distance(p1,p2):
return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
#点pとtriangleの内の点で点pに最も近い2点から構成される三角形を出力
def select_neighbor_points(p, triangle):
distance1 = distance(p, triangle[0])
distance2 = distance(p, triangle[1])
distance3 = distance(p, triangle[2])
if distance1 > distance2:
if distance1 > distance3:
return [p, triangle[1], triangle[2]]
else:
return [p, triangle[0], triangle[1]]
else:
if distance2 > distance3:
return(p, triangle[0],triangle[2])
else:
return(p, triangle[0],triangle[1])
#fractal図形を生成する。iteration数が大きいほど複雑になる
def produce_fractal1(triangle, iteration):
if iteration == 0: return 0
p1 = triangle[0]
p2 = triangle[1]
p3 = triangle[2]
new_triangle = return_triangle(triangle)
p = pat.Polygon(xy = new_triangle,fc = "white", ec = "black")
ax.add_patch(p)
produce_fractal1(select_neighbor_points(p1,new_triangle), iteration-1)
produce_fractal1(select_neighbor_points(p2,new_triangle), iteration-1)
produce_fractal1(select_neighbor_points(p3,new_triangle), iteration-1)
triangle = [(0.2, 0.2), (0.8, 0.2), (0.5, 0.8)] #初期三角形の座標
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(1,1,1)
p = pat.Polygon(xy = triangle,fc = "white", ec = "black")
ax.add_patch(p)
produce_fractal1(triangle,6)
fig.savefig("./fractal.png") #画像の保存
再帰処理で簡単に実装できる.実行はjupyterで行った.
fractal.py
produce_fractal1(triangle,iteration)
iterationの数を大きくするとより深い層まで三角形がつくられる.
#3.まとめ
再帰処理をうまく実装することでシェルピンスキーのギャスケットを作ることができた.再帰処理の中身を変えることで他のフラクタル図形を作成できる.