木の習作(2020.05.25)

再帰による木構造の描画

 植物の構造を描く場合、例えば、

  1. まっすぐ枝を伸ばし、
  2. 伸ばした枝の少し右側に枝を描き、
  3. 左側にも枝を描く

という処理を繰り返すと木のような構造を描画できます。

 この再帰的な手法を用いて、いい感じの木を描こうと思ったのですが、 なかなか上手くいきませんでした。

ソースコード

 関数 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)

 木のような、自然界に存在する魅力的な構造を描くのは難しいと痛感しております。