如何使用 Turtle [Python 3] 制作最高效的希尔伯特曲线?
How can I make the most efficient Hilbert Curve with Turtle [Python 3]?
我正在尝试制作一条用尽可能少的时间完成的希尔伯特曲线。这是到目前为止的代码(改编自 Hilbert curve using turtle graphics and recursion)
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()
这个问题是乌龟做了很多不必要的转弯 - 在开始和所有连接处 - 我明白为什么会发生这种情况,但我不知道如何解决它。
如果我可以在上面的代码中更改任何其他内容以使 turtle 更快,欢迎提出建议!
如果不重新考虑程序的整个方法,这里有一个可以显着加快速度的快速修复方法。我们将使用 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)
在几秒钟内用分形填充 window。
我正在尝试制作一条用尽可能少的时间完成的希尔伯特曲线。这是到目前为止的代码(改编自 Hilbert curve using turtle graphics and recursion)
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()
这个问题是乌龟做了很多不必要的转弯 - 在开始和所有连接处 - 我明白为什么会发生这种情况,但我不知道如何解决它。
如果我可以在上面的代码中更改任何其他内容以使 turtle 更快,欢迎提出建议!
如果不重新考虑程序的整个方法,这里有一个可以显着加快速度的快速修复方法。我们将使用 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)
在几秒钟内用分形填充 window。