[英]Strange L-system in python turtle graphics
我嘗試使用Python 3中的turtles模塊來重新創建在這里找到的分形: https : //en.wikipedia.org/wiki/L-system#Example_7 : _Fractal_plant,但是每當嘗試它時,它都會給我一個非常奇怪的結果。 。
這是我的代碼:
import turtle
wn = turtle.Screen()
wn.bgcolor("white")
wn.screensize(10000, 10000)
tess = turtle.Turtle()
tess.color("lightgreen")
tess.pensize(1)
tess.speed(0)
tess.degrees()
inst = 'X'
steps = 3
for counter in range(steps):
_inst = ''
for chtr in inst:
if chtr == 'X':
_inst += 'F−[[X]+X]+F[+FX]−X'
elif chtr == 'F':
_inst += 'FF'
else:
_inst += chtr
inst = _inst
print(inst)
for chtr in inst:
if (chtr == 'F'):
tess.forward(25)
elif (chtr == '+'):
tess.right(25)
elif (chtr == '-'):
tess.left(25)
elif (chtr == '['):
angle = tess.heading()
pos = [tess.xcor(), tess.ycor()]
elif (chtr == ']'):
tess.setheading(angle)
tess.penup()
tess.goto(pos[0], pos[1])
tess.pendown()
wn.exitonclick()
我仔細檢查了所有內容,但似乎沒有錯誤-但仍然無法正常工作。 我到底在做什么錯?
在此先感謝您的幫助!
根據Wikipedia頁面,符號“ [”表示保存當前狀態(角度和位置)。 匹配的“]”表示恢復先前保存的位置。 因為'['和']'可以嵌套,所以需要一個堆棧。
from collections import deque
...
stack = deque()
for chtr in inst:
if (chtr == 'F'):
tess.forward(25)
elif (chtr == '+'):
tess.right(25)
elif (chtr == '-'):
tess.left(25)
elif (chtr == '['):
angle = tess.heading()
pos = [tess.xcor(), tess.ycor()]
stack.append((angle, pos)) ### New statement
elif (chtr == ']'):
angle, pos = stack.pop() ### New statement
tess.setheading(angle)
tess.penup()
tess.goto(pos[0], pos[1])
tess.pendown()
. . .
您的代碼中有兩個問題。
首先是您的代碼不能正確處理嵌套的括號。 內部打開托架將其狀態保存在看到外部打開托架時所保存的先前狀態的上方。 對於[[X]+X]
類的立即嵌套的括號,這無關緊要(因為它們都有相同的起始狀態),但是一旦您獲得了更復雜的嵌套(就像在幾次替換循環之后一樣),問題就會開始出現事情出了問題。
為了解決這個問題,您可能希望將保存的狀態值存儲到堆棧中( list
可以執行此操作)。 推送要保存的值,並在准備恢復它們時將其彈出。
stack = [] # use a list for the stack
for chtr in inst:
if (chtr == 'F'):
tess.forward(25)
elif (chtr == '+'):
tess.right(25)
elif (chtr == '-'):
tess.left(25)
elif (chtr == '['):
angle = tess.heading()
pos = [tess.xcor(), tess.ycor()]
stack.append((angle, pos)) # push state to save
elif (chtr == ']'):
angle, pos = stack.pop() # pop state to restore
tess.setheading(angle)
tess.penup()
tess.goto(pos[0], pos[1])
tess.pendown()
第二個問題比較瑣碎。 您的解析器將查找“減號”字符( -
)。 但是,您的模式生成代碼使用了不同的,稍長的破折號( −
)。 更改其中一個以匹配另一個(哪一個都不重要),您的代碼將按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.