为什么我的程序不生成龙曲线?
Why doesn't my program generate the dragon curve?
我编写了一个使用 L 系统绘制分形的程序。它似乎适用于 Sierpinski 三角形,但不适用于龙曲线。
我知道网站上有一些关于使用海龟图形创建龙曲线的问题,但其中 none 似乎特别适用,所以我提出了自己的问题。我的代码生成的字符串,作为海龟指令,似乎是正确的。我认为问题在于乌龟如何解释该字符串。为什么它适用于 Sierpinski 三角形而不适用于龙曲线,这令人费解,并让我认为我输入的规则是错误的,但我检查了多个来源,它们似乎是正确的。
from tkinter import *
import turtle
Width=500
Height=500
def process_string(string):
return string.translate(str.maketrans({'X':'X+YF+','Y':'−FX−Y'}))
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.25*Width,0.25*Height)
t.pendown()
t.shape("circle")
t.speed("fastest")
for char in string:
if char=="F":
t.forward(5)
elif char=="+":
t.right(90)
elif char=="-":
t.left(90)
root=Tk()
canvas=Canvas(width=Width, height=Height)
canvas.pack()
draw(createSystem("FX",10))
print("COMPLETE")
root.mainloop()
我希望看到 dragon curve,但该程序只生成一条由线和框组成的波浪曲线。
这一行:
return string.translate(str.maketrans({'X':'X+YF+','Y':'−FX−Y'}))
您正在使用 Unicode 字符“-”表示左转。但是在这一行中:
elif char=="-":
您正在为左转使用基本的 ASCII hyphen/minus。让他们就 hyphen/minus 达成一致,你应该释放你的龙!
虽然你的嵌入式乌龟有一个tkinter包装器,这也可以只使用独立乌龟来完成:
from turtle import Screen, Turtle
TRANSLATION = str.maketrans({'X': "X+YF+", 'Y': "-FX-Y"})
def process_string(string):
return string.translate(TRANSLATION)
def createSystem(string, depth):
for _ in range(depth):
string = process_string(string)
return string
def draw(string):
for character in string:
if character == 'F':
turtle.forward(5)
elif character == '+':
turtle.right(90)
elif character == '-':
turtle.left(90)
turtle = Turtle()
turtle.shape('circle')
turtle.shapesize(0.2)
turtle.speed('fastest')
draw(createSystem("FX", 10))
turtle.hideturtle()
screen = Screen()
screen.exitonclick()
我假设您将使用 tkinter 向您的程序添加一些控件。
我编写了一个使用 L 系统绘制分形的程序。它似乎适用于 Sierpinski 三角形,但不适用于龙曲线。
我知道网站上有一些关于使用海龟图形创建龙曲线的问题,但其中 none 似乎特别适用,所以我提出了自己的问题。我的代码生成的字符串,作为海龟指令,似乎是正确的。我认为问题在于乌龟如何解释该字符串。为什么它适用于 Sierpinski 三角形而不适用于龙曲线,这令人费解,并让我认为我输入的规则是错误的,但我检查了多个来源,它们似乎是正确的。
from tkinter import *
import turtle
Width=500
Height=500
def process_string(string):
return string.translate(str.maketrans({'X':'X+YF+','Y':'−FX−Y'}))
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.25*Width,0.25*Height)
t.pendown()
t.shape("circle")
t.speed("fastest")
for char in string:
if char=="F":
t.forward(5)
elif char=="+":
t.right(90)
elif char=="-":
t.left(90)
root=Tk()
canvas=Canvas(width=Width, height=Height)
canvas.pack()
draw(createSystem("FX",10))
print("COMPLETE")
root.mainloop()
我希望看到 dragon curve,但该程序只生成一条由线和框组成的波浪曲线。
这一行:
return string.translate(str.maketrans({'X':'X+YF+','Y':'−FX−Y'}))
您正在使用 Unicode 字符“-”表示左转。但是在这一行中:
elif char=="-":
您正在为左转使用基本的 ASCII hyphen/minus。让他们就 hyphen/minus 达成一致,你应该释放你的龙!
虽然你的嵌入式乌龟有一个tkinter包装器,这也可以只使用独立乌龟来完成:
from turtle import Screen, Turtle
TRANSLATION = str.maketrans({'X': "X+YF+", 'Y': "-FX-Y"})
def process_string(string):
return string.translate(TRANSLATION)
def createSystem(string, depth):
for _ in range(depth):
string = process_string(string)
return string
def draw(string):
for character in string:
if character == 'F':
turtle.forward(5)
elif character == '+':
turtle.right(90)
elif character == '-':
turtle.left(90)
turtle = Turtle()
turtle.shape('circle')
turtle.shapesize(0.2)
turtle.speed('fastest')
draw(createSystem("FX", 10))
turtle.hideturtle()
screen = Screen()
screen.exitonclick()
我假设您将使用 tkinter 向您的程序添加一些控件。