0

我正在尝试制作一个需要尽可能少的时间来完成的希尔伯特曲线。这是到目前为止的代码(使用海龟图形和递归改编自希尔伯特曲线

from turtle import *
from win32api import GetSystemMetrics



def hilbert_curve(amt, facing, n, start_at_corner=True) -> None:
    if start_at_corner:
        ht()
        up()
        goto(x=(- (GetSystemMetrics(0) - 30) / 2), y=(- (GetSystemMetrics(1) / 2 - 50)))
        down()

    if n < 1:
        return

    try:    # Only here because I find error messages annoying
        left(facing * 90)
        hilbert_curve(amt, - facing, n - 1, False)
        fd(amt)
        right(facing * 90)
        hilbert_curve(amt, facing, n - 1, False)
        fd(amt)
        hilbert_curve(amt, facing, n - 1, False)
        right(facing * 90)
        fd(amt)
        hilbert_curve(amt, - facing, n - 1, False)
        left(facing * 90)

    except Terminator:
        from sys import exit
        exit()


screen = getscreen()
speed(0)
hilbert_curve(5, 1, 15)
screen.mainloop()

这个问题是乌龟做了很多不必要的转弯 - 在开始和所有连接时 - 我理解为什么会发生这种情况,但我不知道如何解决它。

如果我可以在上面的代码中更改任何其他内容以使海龟更快,欢迎提出建议!

4

1 回答 1

0

没有重新考虑程序的整个方法,这里有一个快速修复,可以显着加快速度。我们将使用tracer()update()来精确控制图形。我们不想隐藏任何绘图(可以使用tracer()),而是只在有一条线要绘制时进行绘制,将海龟的所有转弯视为内部逻辑计算,仅显示最终标题:

from turtle import Screen, Turtle

def hilbert_curve(distance, facing, n):
    if n < 1:
        return

    turtle.left(facing * 90)
    hilbert_curve(distance, -facing, n - 1)
    turtle.forward(distance)
    screen.update()

    turtle.right(facing * 90)
    hilbert_curve(distance, facing, n - 1)
    turtle.forward(distance)
    screen.update()

    hilbert_curve(distance, facing, n - 1)
    turtle.right(facing * 90)
    turtle.forward(distance)
    screen.update()

    hilbert_curve(distance, -facing, n - 1)
    turtle.left(facing * 90)

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.penup()
turtle.goto(10 - screen.window_width()/2, 20 - screen.window_height()/2)
turtle.pendown()

hilbert_curve(5, 1, 15)

screen.tracer(True)
screen.mainloop()

另一方面,如果您不关心观看绘图并且只想用希尔伯特曲线尽快填充平面,screen.update()则从上述代码中删除调用并更改此行:

screen.tracer(False)

改为:

screen.tracer(1000)

在几秒钟内用分形填充窗口。

于 2021-11-17T18:00:02.323 回答