Python中10阶龙曲线

0 投票
1 回答
691 浏览
提问于 2025-04-18 05:45

为什么我的龙曲线看起来不像龙曲线呢?

龙曲线

这是用Python实现的10阶龙曲线:

def setupForDragonCurve():
    turtle.hideturtle()
    turtle.tracer(1e3, 0)
    turtle.penup()
    turtle.goto(0, -turtle.window_height()/5)
    turtle.pendown()

def generateDragonCurve(n, result='[FX]'):
    for _ in range(n):
        result = result.replace('Y', 'FX-Y')
        result = result.replace('X', 'X+YF')
    return result

def drawDragonCurve(cmds, size):
    stack = []
    for cmd in cmds:
        if cmd=='F':
            turtle.forward(size)
        elif cmd=='-':
            turtle.left(90)
        elif cmd=='+':
            turtle.right(90)
        elif cmd=='X':
            pass
        elif cmd=='Y':
            pass
        elif cmd=='[':
            stack.append((turtle.position(), turtle.heading()))
        elif cmd==']':
            position, heading = stack.pop()
            turtle.penup()
            turtle.setposition(position)
            turtle.setheading(heading)
            turtle.pendown()
        else:
            raise ValueError('Unknown Cmd: {}'.format(ord(cmd)))
    turtle.update()

这是10阶龙曲线应该呈现的样子:

龙曲线

补充:这是我在1阶时得到的结果,曲线放大了一些:

龙曲线1阶

1 个回答

1

当你运行

    result = result.replace('Y', 'FX-Y')
    result = result.replace('X', 'X+YF')

时,第二行会把第一行引入的X替换掉。(另外,你用的替换规则不太对,但你似乎已经注意到了这一点。)

你需要以一种不会互相影响的方式来进行这些替换,可能可以通过合并步骤来实现。一个方法是使用re模块更高级的替换功能。另一个方法是自己写一个替换的程序。你也可以在第一次替换时用一个不同于X的字符,这样第二次替换就不会把它替换掉,然后再在第三步中把那个字符替换成X

撰写回答