在希尔伯特曲线中,如何将库龟从更改为 matplotlib?
In the Hilbert Curve, How can I change the library turtle from to matplotlib?
我真的不知道如何解决保持递归的问题,我正在研究 turtle 库但是在签名中他们要求使用 matplotlib 所以我不太确定如何使用它
from turtle import Turtle
def hilbert_curve(turtle, A, parity, n):
if n == 1:
hilbert_curve_draw(turtle, A, parity)
else:
turtle.right(parity * 90)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.forward(A)
turtle.left(parity * 90)
hilbert_curve(turtle, A, parity, n - 1)
turtle.forward(A)
hilbert_curve(turtle, A, parity, n - 1)
turtle.left(parity * 90)
turtle.forward(A)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.right(parity * 90)
def hilbert_curve_draw(turtle, A, parity):
turtle.right(parity * 90)
turtle.forward(A)
turtle.left(parity * 90)
turtle.forward(A)
turtle.left(parity * 90)
turtle.forward(A)
turtle.right(parity * 90)
yertle = Turtle()
yertle.hideturtle()
yertle.penup()
yertle.goto(-200, 200)
yertle.pendown()
yertle.speed('fastest')
hilbert_curve(yertle, 60, 1, 3)
乌龟通过其位置和方向保持内部状态。这些可以由局部变量表示。方向可以是表示长度为 1 的向量的元组 (xdir, ydir)
。向左转会将向量与旋转矩阵相乘。当仅使用坐标为 -1
、0
和 1
的矢量时,可以简化旋转。
下面的代码实现了这些想法。为了使内容更具可读性,A
已重命名为 length
,n
已重命名为 levels
。
from matplotlib import pyplot as plt
def turn_left(orient, parity):
return (orient[1] * parity, -orient[0] * parity)
def turn_right(orient, parity):
return turn_left(orient, -parity)
def draw_line(x0, y0, orient, length):
x1 = x0 + orient[0] * length
y1 = y0 + orient[1] * length
plt.plot([x0, x1], [y0, y1], color='navy')
return x1, y1
def hilbert_curve_draw(x, y, length, orient, parity):
orient = turn_right(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_right(orient, parity)
return x, y, orient
def hilbert_curve(x, y, length, orient, parity, levels):
if levels == 1:
x, y, orient = hilbert_curve_draw(x, y, length, orient, parity)
else:
orient = turn_right(orient, parity)
x, y, orient = hilbert_curve(x, y, length, orient, - parity, levels - 1)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y, orient = hilbert_curve(x, y, length, orient, parity, levels - 1)
x, y = draw_line(x, y, orient, length)
x, y, orient = hilbert_curve(x, y, length, orient, parity, levels - 1)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
x, y, orient = hilbert_curve(x, y, length, orient, - parity, levels - 1)
orient = turn_right(orient, parity)
return x, y, orient
hilbert_curve(x=-200, y=200, length=5, orient=(1, 0), parity=1, levels=5)
plt.axis('equal') # same lengths in x and y direction
plt.show()
我真的不知道如何解决保持递归的问题,我正在研究 turtle 库但是在签名中他们要求使用 matplotlib 所以我不太确定如何使用它
from turtle import Turtle
def hilbert_curve(turtle, A, parity, n):
if n == 1:
hilbert_curve_draw(turtle, A, parity)
else:
turtle.right(parity * 90)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.forward(A)
turtle.left(parity * 90)
hilbert_curve(turtle, A, parity, n - 1)
turtle.forward(A)
hilbert_curve(turtle, A, parity, n - 1)
turtle.left(parity * 90)
turtle.forward(A)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.right(parity * 90)
def hilbert_curve_draw(turtle, A, parity):
turtle.right(parity * 90)
turtle.forward(A)
turtle.left(parity * 90)
turtle.forward(A)
turtle.left(parity * 90)
turtle.forward(A)
turtle.right(parity * 90)
yertle = Turtle()
yertle.hideturtle()
yertle.penup()
yertle.goto(-200, 200)
yertle.pendown()
yertle.speed('fastest')
hilbert_curve(yertle, 60, 1, 3)
乌龟通过其位置和方向保持内部状态。这些可以由局部变量表示。方向可以是表示长度为 1 的向量的元组 (xdir, ydir)
。向左转会将向量与旋转矩阵相乘。当仅使用坐标为 -1
、0
和 1
的矢量时,可以简化旋转。
下面的代码实现了这些想法。为了使内容更具可读性,A
已重命名为 length
,n
已重命名为 levels
。
from matplotlib import pyplot as plt
def turn_left(orient, parity):
return (orient[1] * parity, -orient[0] * parity)
def turn_right(orient, parity):
return turn_left(orient, -parity)
def draw_line(x0, y0, orient, length):
x1 = x0 + orient[0] * length
y1 = y0 + orient[1] * length
plt.plot([x0, x1], [y0, y1], color='navy')
return x1, y1
def hilbert_curve_draw(x, y, length, orient, parity):
orient = turn_right(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
orient = turn_right(orient, parity)
return x, y, orient
def hilbert_curve(x, y, length, orient, parity, levels):
if levels == 1:
x, y, orient = hilbert_curve_draw(x, y, length, orient, parity)
else:
orient = turn_right(orient, parity)
x, y, orient = hilbert_curve(x, y, length, orient, - parity, levels - 1)
x, y = draw_line(x, y, orient, length)
orient = turn_left(orient, parity)
x, y, orient = hilbert_curve(x, y, length, orient, parity, levels - 1)
x, y = draw_line(x, y, orient, length)
x, y, orient = hilbert_curve(x, y, length, orient, parity, levels - 1)
orient = turn_left(orient, parity)
x, y = draw_line(x, y, orient, length)
x, y, orient = hilbert_curve(x, y, length, orient, - parity, levels - 1)
orient = turn_right(orient, parity)
return x, y, orient
hilbert_curve(x=-200, y=200, length=5, orient=(1, 0), parity=1, levels=5)
plt.axis('equal') # same lengths in x and y direction
plt.show()