parametric L-system with timing

parametric_lsys_timing.gh

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.