Pythonでコッホ曲線を描く

2-3.Perl/Python/Ruby


アニメ『フラクタル』(2011)
家族が遠隔地でばらばらに住んでるけど、ネットワークを通してアバターを使って近くに感じられる光景がすごく奇妙に思えます。テレワークならぬテレファミリー。これは家族とは言わないのでは? 近未来の家族がこんな風になったら嫌ですねえ。
このアニメの世界観って働きたくない人にとってはすごくいい。定住せずに好きな暮らしを好きなだけ楽しむ、働かなくても所得が得られる。素晴らしい世界かもしれない。
働きたい私にとってはあまり好きな設定ではないですが、冒頭に出てくる草原と海、断崖絶壁に建つ小さな家ってのは素敵すぎ。将来こんなところに住みたいです。

フラクタルいうことでコッホ曲線を描いてみます。

線分ABがあります。

線分ABを三分割して、C点、D点を求めます。

ABx= Bx - Ax
ABy= By - Ay
ACx= ABx / 3
ACy= ABy / 3
Cx = Ax + ACx
Cy = Ay + ACy
Dx = Ax + ACx*2
Dy = Ay + ACy*2

ACを60°回転させてE点を求めます。

AEにACを足して、E点をずらします。

Ex = cos(r)*ACx - sin(r)*ACy + Cx
Ey = sin(r)*ACx + cos(r)*ACy + Cy

図形を描くためPython + Pillowをインストールしておきます。

# apt-get intall python-pip
# pip install pillow

では、出来上がりです。

     1	from PIL import Image,ImageDraw
     2	from math import *
     3	
     4	r=-pi/3
     5	def div_pos(num,lis):
     6	        if num>0:
     7	                (Ax,Ay)=lis[0]
     8	                ind=1
     9	                for (Bx,By) in lis[1:]:
    10	                        ABx= Bx - Ax
    11				ABy= By - Ay
    12				ACx= ABx / 3
    13				ACy= ABy / 3
    14				Cx = Ax + ACx
    15				Cy = Ay + ACy
    16				Dx = Ax + ACx*2
    17				Dy = Ay + ACy*2
    18				Ex = cos(r)*ACx - sin(r)*ACy + Cx
    19				Ey = sin(r)*ACx + cos(r)*ACy + Cy
    20	                        lis.insert(ind,  (Cx,Cy))
    21	                        lis.insert(ind+1,(Ex,Ey))
    22	                        lis.insert(ind+2,(Dx,Dy))
    23	                        ind=ind+4
    24	                        Ax = Bx
    25				Ay = By
    26	                div_pos(num-1,lis)
    27	
    28	poslist=[(0,240),(640,240)]
    29	div_pos(4,poslist)
    30	
    31	cyan=(0,255,255)
    32	white=(255,255,255)
    33	black=(0,0,0)
    34	
    35	img=Image.new('RGB',(640,300), black)
    36	draw=ImageDraw.Draw(img)
    37	
    38	(Ax,Ay)=poslist[0]
    39	for (Bx,By) in poslist[1:]:
    40		draw.line((Ax,Ay, Bx,By),fill=cyan)
    41		Ax = Bx
    42		Ay = By
    43	
    44	img.save('koch.png')
    45	

コメント

タイトルとURLをコピーしました