使用numpy数组离散化路径并确保点间距离相等

4 投票
1 回答
2702 浏览
提问于 2025-04-18 09:51

假设我在一个二维平面上有一条路径,这条路径是通过参数化来表示的,比如说阿基米德螺旋线:

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 的步长设置得太大了,这样的话螺旋就不是一个光滑的曲线,而是由一段段直线组成的。结果如下:

enter image description here

撰写回答