为什么我的程序为什么不生成龙曲线?

时间:2019-07-30 16:02:03

标签: python tkinter turtle-graphics fractals l-systems

我编写了一个使用L系统绘制分形的程序。它似乎适用于Sierpinski三角形,但不适用于龙曲线。

我知道网站上存在一些有关使用乌龟图形创建龙曲线的问题,但是似乎没有一个特别适用,因此我提出了自己的问题。按照乌龟的指示,我的代码生成的字符串似乎是正确的。我认为问题在于乌龟如何解释该字符串。为什么它适用于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,但是该程序只是生成由线和框组成的弯曲曲线。

1 个答案:

答案 0 :(得分:0)

在这一行:

 return string.translate(str.maketrans({'X':'X+YF+','Y':'−FX−Y'}))

您正在向左拐使用Unicode字符“-”。但在这一行:

elif char=="-":

您在左转弯时使用了基本的ASCII连字符/减号。让它们在连字符/减号上达成共识,然后释放龙!

尽管您的嵌入式乌龟有一个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()

enter image description here

我假设您将使用tkinter在程序中添加一些控件。