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.