【问题标题】:Why doesn't my program generate the dragon curve?为什么我的程序没有生成龙曲线?
【发布时间】:2019-07-30 16:02:03
【问题描述】:

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

我知道网站上有一些关于使用海龟图形创建龙曲线的问题,但似乎没有一个问题特别适用,所以我提出了自己的问题。作为海龟指令,我的代码生成的字符串似乎是正确的。我认为问题在于海龟如何解释该字符串。为什么它应该适用于谢尔宾斯基三角形而不适用于龙曲线令人费解,这让我认为我输入的规则是错误的,但是我检查了多个来源,它们似乎是正确的。

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,但该程序只会生成由线条和框组成的波浪曲线。

【问题讨论】:

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


    【解决方案1】:

    在这一行:

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

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

    elif char=="-":
    

    您在左转使用基本的 ASCII 连字符/减号。让这些就连字符/减号达成一致,你应该释放你的龙!

    虽然您的 embedded turtle 周围有一个 tkinter 包装器,但也可以仅使用 standalone turtle 来完成:

    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 为您的程序添加一些控件。

    【讨论】:

    • @EliRees,我很高兴能帮上忙。我重读了你的问题,我不知道为什么人们投了反对票。我只是赞成它,因为很明显我发现这是一个值得花时间研究的问题。而且这个错误一点也不明显!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多