Figure 1.37 b で紹介されている描画の長さにパラメータを与えるのに加え、書き換えのタイミングをずらすパラメータも当てます。
ベースは前ポストのparametric L-systemを使って、コンポーネント rewrite 側のコードのみの変更で実現できますが、rewriteSPの改良版 rewriteSPT という関数も作ります。下にサンプルとしてコードを貼ります。
このL-systemではprm と tim という2つのリストを扱わなければなりません。
prm は’F’ の長さの調節
tim は書き換えが行われるタイミングを調節(ずらす)するのに使われます。
import random import math #difinition----------------> avairableParamChar = 'ABCDEFLRabcdeflr' def rewriteSPT(s_p,rs,ts,prm,tim): s = s_p[0] op = s_p[1] otm = s_p[2] sss = '' for ss in s: if avairableParamChar.find(ss) != -1: sss += ss if len(sss) != len(op): print "warning, parameter is too short or too long!!" nt = [] for otmm in otm: if otmm == 0: prd = [] for timm in tim: prd.append(timm) nt.extend(prd) elif(otmm>0): nt.append(otmm-1) np = [] for i in range(len(op)): if otm[i] == 0: prd = [] for p in prm: prd.append(p*op[i]) np.extend(prd) else: np.append(op[i]) ns = '' tcount = 0 for ss in s: if ss == rs: if otm[tcount] == 0: ns += ts else: ns += ss tcount += 1 else: ns += ss return [ns,np,nt] #difinition----------------< c = 1 p = 0.3 q = c - p h = math.sqrt(p*q) s_p_t = ['F',[1],[0]] for i in range(0,int(n)): s_p_t = rewriteSPT(s_p_t,'F','F+F--F+F',[p,h,h,q],[2,1,1,0]) a = [s_p_t[0],s_p_t[1]]
s_p_t = ['F',[1],[0]] for i in range(0,int(n)): s_p_t = rewriteSPT(s_p_t,'F','F+F--F+F',[p,h,h,q],[2,1,1,0])
こちらもルールとパラメータ、タイミングの設定で、各要素数が等しくなるのが要件です。
初期値セット: [‘F’,[1],[0]] ’F’が一文字、パラメータ[1]がひとつ、タイミング[0] がひとつ
書き換えルール: rewriteSPT(s_p_t,’F’,’F+F–F+F’,[p,h,h,q],[2,1,1,0]) ’F+F–F+F’ ’F’が4文字、[p,h,h,q]4要素、[2,1,1,0]4要素
Comments are closed.