[英]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.