【问题标题】:Strange L-system in python turtle graphicspython乌龟图形中奇怪的L系统
【发布时间】:2016-03-26 04:45:58
【问题描述】:

我尝试使用 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()

我对所有内容进行了三次检查,似乎没有任何错误 - 但它仍然无法正常工作。我做错了什么?

提前感谢您的帮助!

【问题讨论】:

    标签: python python-3.x fractals l-systems


    【解决方案1】:

    您的代码中有两个问题。

    首先是您的代码没有正确处理嵌套括号。内部开口支架将其状态保存在看到外部开口支架时保存的先前状态的顶部。这对于像[[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()
    

    第二个问题比较琐碎。您的解析器会查找“减号”字符 (-)。但是您的模式生成代码使用了一种不同的、稍长的破折号 ()。更改其中一个以匹配另一个(哪个并不重要),您的代码将按预期工作。

    【讨论】:

    • @Blcknght,谢谢!出于某种原因,在维基上它说[ 意味着保存当前的角度和位置,覆盖所有以前的保存。但现在有效!
    【解决方案2】:

    根据维基百科页面,符号'['表示保存当前状态(角度位置)。匹配的 ']' 表示恢复之前保存的位置。因为 '[' 和 ']' 可以嵌套,所以需要一个栈。

    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()
    
    . . .
    

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多