假设我在 2d 平面上有一条由参数化给出的路径,例如阿基米德螺线:
\n\nx(t) = a*\xcf\x86*cos(\xcf\x86) , y(t) = a*\xcf\x86*sin(\xcf\x86)
\n\n我正在寻找一种用 numpy 数组离散化它的方法,\n问题是如果我使用
\n\na = 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")\nRun Code Online (Sandbox Code Playgroud)\n\n我得到了一条漂亮的曲线,但这些点的距离不一样,随着\n增长\xcf\x86,两点之间的距离变得更大。\n我正在寻找一种好的且如果可能的话快速的方法来做到这一点。
\n也许可以获得简单螺旋的精确分析公式,但我没有心情这样做,而且在更一般的情况下这可能是不可能的。相反,这里有一个数值解:
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,如果步长太大,您会发现螺旋不是平滑曲线,而是由直线段构建而成。结果:

| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |