再帰による木構造の描画
短いコードで植物を表現するのは、自分にはまだ難しいみたい。コードの方も、文字数超過どころではなく、3 ツィートくらい必要っぽい。
— Koji Saito (@KojiSaito) May 25, 2020
頑張れば、つぶやきProcessing できるかも?と思ったけど甘かったみたいです。精進します。#dailycodingchallenge #Processing #generativeart pic.twitter.com/JzaPCjuhKH
植物の構造を描く場合、例えば、
- まっすぐ枝を伸ばし、
- 伸ばした枝の少し右側に枝を描き、
- 左側にも枝を描く
という処理を繰り返すと木のような構造を描画できます。
この再帰的な手法を用いて、いい感じの木を描こうと思ったのですが、 なかなか上手くいきませんでした。
ソースコード
関数 T が実際に枝を描く処理をしています。 T の中から T を呼び出している部分がありますので、 再帰していることが分かると思います:
def setup():
size(500,500)
stroke(0)
def T(l,w,n):
f=frameCount*.01
if n==0: return
strokeWeight(w+.5)
w*=random(1)*.5+.3
d=-l*(random(1)*.5+.3)
line(0,0,0,d)
translate(0,d)
if random(1)<.8:
push()
rotate(random(2)-1+sin(f)*.2)
T(l*random(1.8),w,n-1)
pop()
else:
T(l*random(1.5),w*.7,n-1)
if random(1)<.3:
push()
rotate(-random(2)+1-sin(f)*.2)
T(l*random(1.5),w,n-1)
pop()
else:
T(l*random(1.5),w*.8,n-1)
def draw():
background(-1)
randomSeed(0)
translate(250,530)
T(40,15,12)
木のような、自然界に存在する魅力的な構造を描くのは難しいと痛感しております。