簡體   English   中英

使用海龜圖形在 l 系統代碼中恢復記錄的 state

[英]restoring recorded state in l-system code using turtle graphics

我正在使用海龜圖形來重現 l 系統(TurtleWorld 庫)。 我嘗試應用的規則在不涉及返回到以前保存的 state 時效果很好,但是只要有 [ 和 ](參見下面的規則),事情就會中斷,烏龜只會隨機繪制 bs。

基本上,我認為檢查 ']' 存在位置的 IF 語句是代碼中斷的地方。 (另外,我知道它目前沒有優化,為了清楚起見,我寫了一個可靠的 IF ......)

編輯:新代碼 - 這整個計算角度的事情是不必要的,因為我們有 get_heading(),它告訴我們我們所面對的角度。

import turtle

turtle.down()

n = 'F'

s1 = 'F'
s2 = 'FF-[-F+F+F]+[+F-F-F]'
#s3 = 'F'
#s4 = 'FF'

steps = 5

for i in range(steps):
    n = n.replace(s1,s2)
    #n = n.replace(s3,s4)

a = 25

x = []
y = []
angle = []

for i in n:
    if i == 'F':
        turtle.forward(2)
    if i == '+':
        turtle.left(a)
    if i == '-':
        turtle.right(a)
    if i=='[':
        x.append(turtle.xcor())
        y.append(turtle.ycor())
        angle.append(turtle.heading())
    if i==']':
        turtle.pu()
        turtle.setpos(x[len(x)-1],y[len(y)-1])
        turtle.right(turtle.heading())
        turtle.setheading(angle[len(angle)-1])
        x.pop()
        y.pop()
        angle.pop()
        turtle.pd()

幾個想法:

  • 您永遠不會在] -處理程序中將angle設置為新角度( newa )。
  • 根據評論,您的條件是錯誤的,如果角度為正, newa>0會將其向左轉。
  • 您確定rt可以很好地處理負角嗎?
  • 如果您改用pop並推送 state 的元組或類似的東西,您可以大大簡化您的代碼。
  • -1的索引等於len(lst) - 1

pop建議的示例:

>>> state = []
>>> angle = 90
>>> posx = 10
>>> posy = 15
>>> state.append((angle, posx, posy))
>>> angle = 40
>>> angle, posx, posy = state.pop()
>>> angle
90

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM