在L系统代码中使用海龟图形恢复记录状态

4 投票
1 回答
776 浏览
提问于 2025-04-16 19:22

我正在使用海龟图形库来重现l-systems(TurtleWorld库)。我尝试应用的规则在不涉及返回到之前保存的状态时效果很好,但每当出现[和](见下面的规则)时,事情就会出错,海龟就会画出一些乱七八糟的东西。

基本上,我觉得检查']'出现位置的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()

1 个回答

2

这里有几个建议:

  • 你在处理 ] 的时候,从来没有把 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

撰写回答