为什么这个L系统只画一条直线?
Why is this L-System only drawing a straight line?
我正在尝试编写一个生成字符串的程序,然后根据字符串中的下一个字符绘制某些行。我相信它会正确生成字符串,因为我已经手动检查了几次迭代,但我使用的乌龟似乎无法正常工作。
例如,下面的代码应该生成谢尔宾斯基三角形,但只画了一条直线。
我已经检查过其他 L 系统(例如龙曲线),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于 turtle 模块如何解释我的指令。这是我第一次使用该模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶。
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 三角形,但只生成一条水平线。
作为最后一个我认为不值得的快速问题 post,乌龟文档说 speed("fastest") 应该删除所有动画,但事实并非如此, 有任何想法吗?感谢大家的抽空!
编辑:我已经根据用户建议更新了代码,虽然这为三角形提供了正确的结果,但它仍然为龙曲线提供了不正确的图像。龙曲线的信息是
”变量:X Y
常量:F + -
开始:外汇
规则 : (X → X+YF+), (Y → −FX−Y)
角度:90°
这里,F表示"draw forward",-表示"turn left 90°",+表示"turn right 90°"。 X和Y不对应任何绘制动作,仅用于控制曲线的演化。"
变化:
if char=="A" or "B":
至:
if char=="A" or char=="B":
问题是
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"}:
这需要恒定的时间来检查任何大小集中的字符。但是对于小集你不会看到时间上的差异。
我正在尝试编写一个生成字符串的程序,然后根据字符串中的下一个字符绘制某些行。我相信它会正确生成字符串,因为我已经手动检查了几次迭代,但我使用的乌龟似乎无法正常工作。
例如,下面的代码应该生成谢尔宾斯基三角形,但只画了一条直线。
我已经检查过其他 L 系统(例如龙曲线),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于 turtle 模块如何解释我的指令。这是我第一次使用该模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶。
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 三角形,但只生成一条水平线。
作为最后一个我认为不值得的快速问题 post,乌龟文档说 speed("fastest") 应该删除所有动画,但事实并非如此, 有任何想法吗?感谢大家的抽空!
编辑:我已经根据用户建议更新了代码,虽然这为三角形提供了正确的结果,但它仍然为龙曲线提供了不正确的图像。龙曲线的信息是
”变量:X Y 常量:F + - 开始:外汇 规则 : (X → X+YF+), (Y → −FX−Y) 角度:90° 这里,F表示"draw forward",-表示"turn left 90°",+表示"turn right 90°"。 X和Y不对应任何绘制动作,仅用于控制曲线的演化。"
变化:
if char=="A" or "B":
至:
if char=="A" or char=="B":
问题是
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"}:
这需要恒定的时间来检查任何大小集中的字符。但是对于小集你不会看到时间上的差异。