假设我在参数化给出的二维平面中有一条路径,例如archimedian螺旋:
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")
我得到一条漂亮的曲线,但是这些点的距离不一样 增长φ2点之间的距离变大。 我正在寻找一个很好的,如果可能的快速方法来做到这一点。
答案 0 :(得分:4)
有可能为你的简单螺旋得到精确的分析公式,但我没有心情这样做,这在更一般的情况下可能是不可能的。相反,这是一个数值解决方案:
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
中使用步长,如果它太大,您会看到螺旋不是平滑曲线,而是由直线段构建。结果: