L-systemで木を描く

未分類

L-systemで植物の成長モデルが描ける。木には枝があり、枝分かれがある。一筆書きのみではなく、枝分かれに対応する。

新たに追加する文字

新たに2つの文字を追加する。

文字説明
[現在位置のx座標、y座標、方向を記憶する
]前回保存したx座標、y座標、方向の位置まで、線を描かずに移動する

新たに必要になるタートルグラフィックスコマンドは以下の通り

命令意味
mode()タートルのモード(“standard”, “logo”, “world” のいずれか)を設定
“standard”:右 (東) 向き 反時計回り
“logo”:上 (北) 向き 時計回り
 “world” はユーザーの定義した「世界座標(world coordinates)」
position()現在座標を返す
heading()現在の方向を返す
setposition(x,y)座標x,yに移動
setheading(角度)角度で指定した方向を向く

pythonコード

import turtle
turtle.mode("logo")
t = turtle.Turtle()

omega = "F"
P = {"F":"F[+F][-F]"}
repeat = 1
distance = 30
angle = 45

stack = []

def turtle3(com):
    if com == "F":
        t.forward(distance)
    if com == "+":
        t.right(angle)        
    if com == "-":        
        t.left(angle)
    if com == "[":
        stack.append([t.position(),t.heading()])
        print(stack)
    if com == "]":
        t.penup()
        s = stack.pop()
        t.setposition(s[0])
        t.setheading(s[1])
        t.pendown()

result = omega
for i in range(repeat):
    result = result.translate(str.maketrans(P))
for x in result:
    turtle3(x)

turtle.done()

できた図は以下の通り。”logo”:上 (北) 向き 時計回り にセットしていることに注意。

F→F[+F][-F]なので

  • 前進する
  • 現在場所、方向を記憶
  • 右45度を向く
  • 前進する
  • 記憶した場所、方向に移動
  • 左45度を向く
  • 前進する
  • 記憶した場所、方向に移動

となり、結果上記の形になる。

例えば、以下のように設定した場合

omega = "F"
P = {"F":"FF[+F-F][-F]F"}
repeat = 3
angle = 25

以下が結果

タイトルとURLをコピーしました