我正在使用 turtle 图形来重现 l 系统(TurtleWorld 库)。我尝试应用的规则在不涉及返回到以前保存的状态时效果很好,但只要有 [ 和 ](请参见下面的规则),事情就会中断, turtle 只会绘制随机 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
并推送一个元组或类似的状态,您可以大大简化您的代码。 -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
关于python - 使用 turtle 图形恢复 l-system 代码中的记录状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6315399/