【问题标题】:Why is this L-System only drawing a straight line?为什么这个 L-System 只画一条直线?
【发布时间】:2023-03-29 13:55:02
【问题描述】:

我正在尝试编写一个生成字符串的程序,然后根据字符串中的下一个字符绘制某些线条。我相信它可以正确生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎没有正常工作。

例如,下面的代码应该生成谢尔宾斯基三角形,但只画了一条直线。

我已经检查过其他 L 系统(例如龙曲线),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用该模块,所以如果我遇到了一些非常基本的错误,我不会感到惊讶。

from tkinter import *
import turtle 

Width=500
Height=500

def process_string(string):
    return string.translate(str.maketrans({'A':'B-A-B','B':'A+B+A'}))


def createSystem(seed,depth):
    string=seed
    for i in range(depth):  
        string=process_string(string)
        print(string)
    return(string)


def draw(string):

    t = turtle.RawTurtle(canvas) 
    t.penup()
    t.goto(-0.4*Width,0.4*Height) #this translation fits more of the curve 
                                   on the screen
    t.pendown()
    t.shape("circle")
    t.speed("fastest")


    for char in string:

        if char=="A" or char=="B":
            t.forward(10)
        elif char=="+":
            t.right(60)
        elif char=="-":
            t.left(60)



root=Tk()
canvas=Canvas(width=Width, height=Height)
canvas.pack()    
draw(createSystem("A",3))
print("COMPLETE")
root.mainloop() }

和以前一样,这个例子应该产生谢尔宾斯基三角形,但只产生一条水平线。

作为我认为不值得发表的最后一个快速问题,海龟文档说 speed("fastest") 应该删除所有动画,但事实并非如此,有什么想法吗?感谢您的宝贵时间!

编辑:我已经用用户建议更新了代码,虽然这为三角形提供了正确的结果,但它仍然为龙曲线提供了不正确的图像。龙曲线的信息是

"变量:X Y 常数:F + - 开始:FX 规则:(X → X+YF+), (Y → −FX−Y) 角度:90° 这里,F 表示“向前拉”,- 表示“左转 90°”,+ 表示“右转 90°”。 X和Y不对应任何绘制动作,仅用于控制曲线的演化。”

【问题讨论】:

  • 正确 if char=="A" or char=="B":if char in ("A", "B"):if char in "AB":

标签: python tkinter turtle-graphics l-systems


【解决方案1】:

问题是

if char=="A" or "B":

意思是

if (char == "A") or "B":

所以它只比较 char"A" 并给出

if True or "B": 

if False or "B": 

先给

if True:

秒给

if "B": 

但这就像

if bool("B"): 

这给了

if True: 

所以最终if char=="A" or "B": 的工作方式类似于if True:,所以这部分代码总是被执行。


必须是

if char == "A" or char == "B": 

if char in ("A", "B"): 

if char in "AB":   

@cdlane 在评论中提到你也可以使用set()

if char in {"A", "B"}: 

需要恒定的时间来检查任何大小集合中的字符。但是对于小集合,您不会看到时间差异。

【讨论】:

  • 据我所知,if char=="A" or "B": 并不是指if char == ("A" or "B"):,而是if (char == "A") or "B":。将char 设置为"C" 以说服自己。既然可以if char in {"A", "B"}:,为什么还要if char in ("A", "B"):
  • @cdlane 由于习惯,我使用("A", "B")。我很少有机会使用set (),所以我忘记了它的存在:)
  • @cdlane 你是对的,它是if (char == "A") or "B",我觉得某个地方是错误的。
【解决方案2】:

变化:

if char=="A" or "B":

到:

if char=="A" or char=="B":

【讨论】:

  • 这适用于示例,但我不确定我理解为什么?逻辑上有什么区别?
  • or 不检查变量是一个值还是另一个值。它将两个条件分开,因此如果char == "A""B" 则该语句为真。总是True 因为"B" 不是空字符串。要测试变量是否是多个值之一,您可以使用 in 关键字和 list,或检查每个可能的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多