python - 使用 turtle 图形恢复 l-system 代码中的记录状态

标签 python turtle-graphics l-systems

我正在使用 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/

相关文章:

python - 根据Python中的另一个字典列表对字典列表进行排序

python - 从 tox.ini 确定所需的 Python 版本并在需要时安装

python - 为什么 Shapely.Geometry 库的 symmetry_difference 和交集操作明显不一致?

python - 使用 Python turtle 制作没有 circle 函数的圆

c - 用C制作我自己的 turtle 图形,无法更改数组中元素的值

c++ - 如何使用 C++ 和 L-Systems 在空间中的任何给定点和方向生成 3d 树?

python - SWIG Python - 包装一个需要双指针指向结构的函数

python - 在Python中的一行中读取两个单独的值

arrays - J 和 L 系统