使用numpy数组离散化路径并确保点间距离相等
假设我在一个二维平面上有一条路径,这条路径是通过参数化来表示的,比如说阿基米德螺旋线:
x(t) = a*φ*cos(φ), y(t) = a*φ*sin(φ)
我想用一个numpy数组来把这条路径离散化,也就是把它分成很多小点。
问题是,如果我使用下面的代码:
a = 1
phi = np.arange(0, 10*np.pi, 0.1)
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)
plt.plot(x,y, "ro")
我得到了一个漂亮的曲线,但这些点之间的距离并不相等。随着φ的增大,两个点之间的距离会变得越来越大。
我在寻找一种既好看又尽可能快的方法来实现这个目标。
1 个回答
6
可能可以找到你简单螺旋的确切公式,但我现在不想去做这个,而且在更一般的情况下可能也不太可能。相反,这里有一个数值解法:
import matplotlib.pyplot as plt
import numpy as np
a = 1
phi = np.arange(0, 10*np.pi, 0.1)
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)
dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths
r = np.zeros_like(x)
r[1:] = np.cumsum(dr) # integrate path
r_int = np.linspace(0, r.max(), 200) # regular spaced path
x_int = np.interp(r_int, r, x) # interpolate
y_int = np.interp(r_int, r, y)
plt.subplot(1,2,1)
plt.plot(x, y, 'o-')
plt.title('Original')
plt.axis([-32,32,-32,32])
plt.subplot(1,2,2)
plt.plot(x_int, y_int, 'o-')
plt.title('Interpolated')
plt.axis([-32,32,-32,32])
plt.show()
这个方法计算了所有小段的长度,然后用 cumsum
把总路径加起来,最后通过插值来得到一个均匀间隔的路径。如果你发现螺旋看起来不够平滑,可能是因为 phi
的步长设置得太大了,这样的话螺旋就不是一个光滑的曲线,而是由一段段直线组成的。结果如下:
