Python 为什么这个L系统只画了一条直线?
我试图编写一个程序,生成字符串,然后根据字符串中的下一个字符绘制特定的行。我相信它能够正确地生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎不能正常工作 例如,下面的代码应该生成Sierpinski三角形,但只绘制一条直线 我已经检查过其他L系统(如dragon curve),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用这个模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶Python 为什么这个L系统只画了一条直线?,python,tkinter,turtle-graphics,l-systems,Python,Tkinter,Turtle Graphics,L Systems,我试图编写一个程序,生成字符串,然后根据字符串中的下一个字符绘制特定的行。我相信它能够正确地生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎不能正常工作 例如,下面的代码应该生成Sierpinski三角形,但只绘制一条直线 我已经检查过其他L系统(如dragon curve),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用这个模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶 from tkinter i
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() }
与前面一样,本例应该生成Sierpinski三角形,但只生成一条水平线
作为最后一个我认为不值得自己发帖的快速问题,海龟文档说速度(“最快”)应该删除所有动画,但事实并非如此,有什么想法吗?谢谢你花了这么多时间
编辑:我已经用用户建议更新了代码,虽然这为三角形提供了正确的结果,但仍然为龙曲线提供了错误的图像。龙曲线的信息如下所示
变量:xy
常数:F+−
起点:FX
规则:(X)→ X+YF+,(Y→ −外汇−Y)
角度:90度
这里,F表示“向前拉”,− 表示“左转90°”,+表示“右转90°”。X和Y不对应于任何绘图动作,仅用于控制曲线的演变。”更改:
如果字符==“A”或“B”:
致:
如果char==“A”或char==“B”:
更改:
如果字符==“A”或“B”:
致:
如果char==“A”或char==“B”:
问题是
if char=="A" or "B":
也就是说
if (char == "A") or "B":
因此,它仅将char
与中的“A”
进行比较,得出
if True or "B":
或
首先给出
if True:
第二次给予
if "B":
但这就像
if bool("B"):
给
if True:
最后,如果char==“A”或“B”:的工作原理类似于如果为True:
,因此这部分代码总是被执行
一定是这样
if char == "A" or char == "B":
或
或
正如@cdlane在评论中提到的,您也可以使用
set()
需要固定的时间来检查任意大小集合中的字符。但对于小集合,你们将看不到时间上的差异。问题是
if char=="A" or "B":
也就是说
if (char == "A") or "B":
因此,它仅将char
与中的“A”
进行比较,得出
if True or "B":
或
首先给出
if True:
第二次给予
if "B":
但这就像
if bool("B"):
给
if True:
最后,如果char==“A”或“B”:的工作原理类似于如果为True:
,因此这部分代码总是被执行
一定是这样
if char == "A" or char == "B":
或
或
正如@cdlane在评论中提到的,您也可以使用
set()
需要固定的时间来检查任意大小集合中的字符。但对于小集合,您将看不到时间上的差异。正确
如果char==“A”或char==“B”:
或如果char在(“A”,“B”)中:
或如果char在“AB”中,则正确如果char==“A”或char==“B”:
或如果char在(“A”,“B”)中:
或如果char在“AB”中:
对于这个例子来说,这是有效的,但我不确定我是否理解为什么?逻辑上有什么区别?或
不会检查变量是一个值还是另一个值。它将这两个条件分开,因此如果char==“A”
或“B”
,则该语句为true。它总是True
,因为的“B”
不是空字符串。要测试一个变量是否是多个值中的一个,您可以将in
关键字与列表一起使用,或者检查每个可能的值。这对于示例是有效的,但我不确定我是否理解为什么?逻辑上有什么区别?或
不会检查变量是一个值还是另一个值。它将这两个条件分开,因此如果char==“A”
或“B”
,则该语句为true。它总是True
,因为的“B”
不是空字符串。要测试一个变量是否是多个值中的一个,您可以将in
关键字与列表一起使用,或者检查每个可能的值。据我所知,if char==“a”或“B”:
并不意味着if char==“a”或“B”):
而是if(char==“a”)或“B”:
。将char
设置为“C”
以说服自己。为什么if-char-in(“A”,“B”):
当你可以做if-char-in{A”,“B}:
?@cdlane我使用(“A”,“B”)
是因为习惯。我很少有机会使用set()
,所以我忘了它的存在:)@cdlane你是对的,它是如果(char==“A”)或“B”
,我觉得有什么地方出错了。据我所知,如果char==“A”或“B”:
并不意味着如果char==“A”或“B”):
而是如果(char==“A”)或“B”):。将char
设置为“C”
以说服自己。为什么if-char-in(“A”,“B”):
当你可以做if-char-in{A”,“B}:
?@cdlane我使用(“A”,“B”)
是因为习惯。我很少有机会使用set()
,所以我忘记了它的存在:)@cdlane你是对的,它是如果(char==“A”)或“B”
,我觉得某个地方出错了。