[英]Why is this L-System only drawing a straight line?
我正在尝试编写一个生成字符串的程序,然后根据字符串中的下一个字符绘制某些线条。 我相信它已经正确生成了字符串,因为我已经手动检查了几次迭代,但是我正在使用的乌龟似乎无法正常工作。
例如,下面的代码应生成Sierpinski三角形,但只能绘制一条直线。
我已经检查了其他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() }
如前所述,该示例应产生Sierpinski三角形,但仅产生一条水平线。
作为最后一个快速问题,我认为不应该提出自己的建议,乌龟文档说speed(“ fastest”)应该删除所有动画,但是不是这样,有什么主意吗? 感谢您的时间!
编辑:我已经用用户建议更新了代码,尽管这为三角形提供了正确的结果,但仍然为龙曲线提供了不正确的图像。 龙曲线的信息是
“变量:XY常数:F +-开始:FX规则:(X→X + YF +),(Y→-FX-Y)角度:90°在这里,F表示“向前拉”,-表示“向左转90° “和,+表示“向右旋转90°”。X和Y与任何绘制动作都不对应,仅用于控制曲线的演变。”
问题是
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 char=="B":
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.