L-System #1 - NodeBox

今回はL-Systemの第1回.果たして何回まで続くのか……

参考

公式:NodeBox | L-system
WikipediaL-system - Wikipedia
その他,いろいろ(解説はけっこう充実している)

とにかく,自分で何か描いてみるのがイチバン!

L-Systemと言えば,木

……なんだけれど,パラメトリックL-Systemの置換規則は直感的に分かり難い.
なので,セグメントが描かれる順に番号をふってみた.
colorsライブラリにも依存します.segment関数は関数外部にも依存する.

size(450, 450)

colors = ximport("colors")
clr = colors.rgb(0.1, 0.095, 0.075)
p = rect(0, 0, WIDTH, HEIGHT, draw=False)
colors.gradientfill(p, clr, clr.lighten(0.25))

lsystem = ximport("lsystem")

count = 0
def segment(length, generation, time=None, id=None):
    global count
    count += 1
    font("Helvetica", 20)
    colors.shadow(dx=10, dy=10, alpha=0.45, blur=4.0)
    fill(0.9, 0.9, 0.9, 0.4)
    push()
    stroke(0.9, 0.9, 0.9, 0.4)
    line(0, 0, 0, -length)
    scale(0.65)
    push()
    rotate(90)
    translate(length*2, length/2)
    arrow(-length, -length/2, length/1.5)
    translate(-length*2, length/2)
    rotate(-90)
    fill(colors.gold())
    text(count, -length/0.95, -length/1.8)
    pop()
    pop()

tree = lsystem.create(angle=45)
tree.segmentlength = 120
tree.segment = segment

tree.rules["1"] = "F[-1]F[+1]1"
tree.draw(WIDTH/2, HEIGHT, 2)

で,こんなのが出力される.

さらに,tree.drawの数字を2から4にすると……

これ以上再帰させると数字が読めなくなる.本当は再帰に合わせてフォントサイズ・位置もアジャストしないといけないんだけれども.
tree.rules["1"]に設定する置換規則を変更してやれば,いろんな図形を描画出来る.
木っぽくするにはセグメントを変更して,アングルは20〜26°くらいに設定すればよいはず.
ちなみに,数字の表示位置や矢印の大きさは微調整したため分かりにくい値になってます.