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

jrs*_*rsm 4 python numpy

假设我在 2d 平面上有一条由参数化给出的路径,例如阿基米德螺线:

\n\n

x(t) = a*\xcf\x86*cos(\xcf\x86) , y(t) = a*\xcf\x86*sin(\xcf\x86)

\n\n

我正在寻找一种用 numpy 数组离散化它的方法,\n问题是如果我使用

\n\n
a = 1\nphi = np.arange(0, 10*np.pi, 0.1)\nx = a*phi*np.cos(phi)\ny = a*phi*np.sin(phi)\nplt.plot(x,y, "ro")\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到了一条漂亮的曲线,但这些点的距离不一样,随着\n增长\xcf\x86,两点之间的距离变得更大。\n我正在寻找一种好的且如果可能的话快速的方法来做到这一点。

\n

Bas*_*els 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()
Run Code Online (Sandbox Code Playgroud)

它计算所有单独线段的长度,整合总路径cumsum,最后进行插值以获得规则间隔的路径。您可能需要调整 中的步长phi,如果步长太大,您会发现螺旋不是平滑曲线,而是由直线段构建而成。结果: 在此输入图像描述