用 Python 制作演示 Hilbert 曲线的 gif 动图

2018-11-20 14:20:38 +08:00
 mathzhaoliang

下图演示的是一个二维的、阶为 n=6 的 Hilbert 分形曲线:

Hilbert 曲线上包含 2^n x 2^n 个不同的点,这些点与 Golay 码一一对应。这个曲线就是利用 Golay 码生成的。

这个图片是用纯 python 生成的,运行时间正好是 1 秒整 (在我的 dell 7050 台式机上)。

代码点这里:

https://github.com/neozhaoliang/pywonderland/blob/master/src/gifmaze/example_hilbert_curve.py

1730 次点击
所在节点    分享创造
1 条回复
SeaRecluse
2018-11-20 17:19:54 +08:00
看上去不错,抛砖引玉下

```python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

#-----------------------------坐标转换----------------------------
def rot(n,x,y,rx,ry):
if ry == 0:
if rx == 1:
x = (n - 1 - x)
y = (n - 1 - y)

tmp = x
x = y
y = tmp

return x,y

def xy2d(n,x,y):
rx,ry,s,d = 0,0,0,0
s = n//2
while s:
rx = 1 if (x&s) > 0 else 0
ry = 1 if (y&s) > 0 else 0
d += s * s * ((3 * rx) ^ ry)
x,y = rot(s,x,y,rx,ry)
s = s//2

return d
#-----------------------------n:2 的次幂----------------------------
n = pow(2,4)
x = np.arange(0,n)
y = np.arange(0,n)

allxy = []
for per_y in y:
for per_x in x:
d = xy2d(n,per_x,per_y)
allxy.append([per_x,per_y,d])

for i in range(len(allxy)):
for j in range(i + 1, len(allxy)):
if allxy[j][2] < allxy[i][2]:
temp = allxy[j]
allxy[j] = allxy[i]
allxy[i] = temp
#-----------------------------画动态图----------------------------
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], '-*', color = "purple", animated=False)

def init():
ax.set_xlim(-0.25, n-0.25)
ax.set_ylim(-0.25, n-0.25)
return ln,

def update(frame):
xdata.append(allxy[frame][0])
ydata.append(allxy[frame][1])
lnT, = ax.plot([], [], '-*', animated=False)
lnT.set_data(xdata[-2:], ydata[-2:])
ln.set_data(xdata[:-1], ydata[:-1])
return ln,lnT

ani = FuncAnimation(fig, update, frames=range(0,pow(n,2)),
init_func=init, blit=True)

plt.show()
#-----------------------------画静态图----------------------------
# allxy = np.array(allxy)
# plt.figure()
# plt.plot(allxy[:,0],allxy[:,1],'-*',color = "purple",linewidth=2)
# plt.show()
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509597

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX