Processing でシダを描く
過去作より棚つか的に紹介。今日は IFS - Iterated Function System 反復関数系によるシダの描画である。図形の一部を縮小して貼り付けるという操作はアフィン変換行列で表されるが、その変換の収束値として表されるという定理が有る。確かバーンスレイの収束定理とか言った気がするが、記憶が曖昧である。詳しい説明についてはバーンスレイの Fractals Everywhere を読んで欲しい(今は新版も出ているようであるが相変わらず値段が高い)。
IFS によるシダの描画は有名であり、いくつかの言語で記述されている。
https://rosettacode.org/wiki/Barnsley_fern
Python モードの Processing のプログラムも掲載されているが、本稿ではよりコンパクトなプログラムを掲載する(といっても、書きっぷりがコンパクトなだけであり、本質的には何も変化していない)。
強いて言えば、加色混合を用いているので、生成される画像が少しばかり魅力的になっている点が異なる。
def setup():
size(500,500)
fill(20,80,10)
noStroke()
blendMode(ADD)
clear()
C=[ [[0,0,0],[0,.16,0]],
[[.85,.04,0],[-.04,.85,1.6]],
[[.2,-.26,0],[.23,.22,1.6]],
[[-.15,.28,0],[.26,.24,.44]]]
def draw():
x=y=0
for k in range(50):
d=random(100)
i=int(d>1)+int(d>86)+int(d>93)
s,t=C[i][0],C[i][1]
u=s[0]*x+s[1]*y+s[2]
v=t[0]*x+t[1]*y+t[2]
x,y=u,v
rect(x*40+200,450-y*40,2,2)
画像が生成される様子は以下の tweet を参照して欲しい:
本稿冒頭の画像は生成された画像を回転・反転している。これをプログラムで生成する場合には、rect 関数部分を
rect(y*40+50,250-x*40,2,2)
とすれば良い。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?