如何用Python Turtle绘制最高效的希尔伯特曲线并消除多余转向
希尔伯特曲线绘制优化方案
核心优化点
- 关闭turtle动画追踪,跳过所有非必要的渲染计算,包括转向过程的动画渲染,这是提速幅度最大的调整
- 消除递归逻辑中的冗余转向:原代码每次递归调用结束都会复位朝向,相邻子递归调用时会出现「复位→立刻转向」的重复操作,优化后直接通过参数传递子递归朝向,取消多余的转向指令
- 把初始位置设置逻辑移出递归函数,避免每次递归都做参数判断和无意义的状态检查
- 移除不必要的嵌套异常捕获,减少运行时开销
优化后代码
from turtle import * from win32api import GetSystemMetrics def hilbert_curve(amt, facing, n) -> None: if n < 1: return left(facing * 90) hilbert_curve(amt, -facing, n - 1) fd(amt) right(facing * 90) hilbert_curve(amt, facing, n - 1) fd(amt) hilbert_curve(amt, facing, n - 1) right(facing * 90) fd(amt) hilbert_curve(amt, -facing, n - 1) left(facing * 90) if __name__ == "__main__": screen = getscreen() # 完全关闭动画追踪,跳过所有中间渲染帧 tracer(0, 0) ht() up() # 初始定位仅执行一次 goto(x=(- (GetSystemMetrics(0) - 30) / 2), y=(- (GetSystemMetrics(1) / 2 - 50))) down() try: hilbert_curve(5, 1, 15) except Terminator: from sys import exit exit() # 所有绘制完成后一次性刷新结果 update() screen.mainloop()
效果说明
调整后15阶希尔伯特曲线的绘制耗时可以压缩到1秒以内,所有不必要的转向操作都被移除,不会再出现绘制过程中反复空转方向的问题。如果需要绘制更高阶的曲线,还可以继续调整步长amt的数值适配屏幕尺寸。
内容的提问来源于stack exchange,提问作者Codeman
相关产品推荐
相关产品推荐

