使用numpy数组和点之间的相等距离​​来离散路径

时间:2014-06-15 12:28:15

标签: python numpy

假设我在参数化给出的二维平面中有一条路径,例如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点之间的距离变大。 我正在寻找一个很好的,如果可能的快速方法来做到这一点。

1 个答案:

答案 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中使用步长,如果它太大,您会看到螺旋不是平滑曲线,而是由直线段构建。结果: enter image description here