我正在编写一个随机生成的样条曲线,首先生成控制点,然后使用spicy.splev进行插值。Here就是一个例子。
点数是这样的:
np.array =[[ 1.00000000e+01 -4.65000000e+02]
[ 1.78319153e+01 -4.60252579e+02]
...]
我现在想要获得每个点与样条曲线的每个点的距离,以查看样条曲线在某一点是否过于接近自身,包括自碰撞。
在每个点之前和之后应该有一个忽略点的间隔,因为这些点始终是每个点的最近点:
def collision(splinePoints, interval):
length = len(splinePoints)
mylist = []
i = -1
for item in splinePoints:
i += 1
first = item
lowerLimit = i - interval
uperLimit = i + interval
if lowerLimit >= 0:
for item in splinePoints[:lowerLimit]:
mylist.append(first)
mylist.append(item)
if uperLimit <= length:
for item in splinePoints[uperLimit:]:
mylist.append(first)
mylist.append(item)
return np.amin(lengthOfLines(np.array(mylist)))
使用以下方法检查行的长度:
def lengthOfLines(points):
return np.sqrt(np.sum(np.diff(points.T)**2, axis=0))
它以某种方式起作用,但并非总是如此。我也在努力调试,因为生成的数据很大,难以检查或比较。知道怎么做得更好吗?
答案 0 :(得分:0)
所有成对距离均使用scipy.spatial包的pdist
方法获得。它返回一个平坦的距离阵列,消除了冗余。效用函数squareform
将它们解包为对称方阵,这通常更方便。
您还希望找到不在曲线上给定点之前或之后的最近点。在下面的示例中,我通过将这些距离设置为无穷大来惩罚邻居之间的距离(在20个索引值内)。然后argmin
为每个人找到最近的点,并通过在最近点绘制一条红线来显示它。
import numpy as np
from scipy.spatial.distance import pdist, squareform
t = np.linspace(0, 10, 50)
points = np.stack(((t+5)*np.cos(t), (t+5)*np.sin(t)), axis=-1) # for example
distances = squareform(pdist(points)) # distance matrix
i, j = np.meshgrid(np.arange(t.size), np.arange(t.size))
distances[np.abs(i-j) <= 20] = np.inf # don't count neighbors
nearest = np.argmin(distances, axis=0) # nearest to each
plt.plot(points[:, 0], points[:, 1])
for k in range(len(t)):
npoint = points[nearest[k]]
plt.plot([points[k, 0], npoint[0]], [points[k, 1], npoint[1]], 'r')
plt.axes().set_aspect('equal', 'datalim')
plt.show()