获取每个点与其他点的距离,并找到曲线接近自身的位置

时间:2017-07-22 22:50:47

标签: python numpy

我正在编写一个随机生成的样条曲线,首先生成控制点,然后使用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))

它以某种方式起作用,但并非总是如此。我也在努力调试,因为生成的数据很大,难以检查或比较。知道怎么做得更好吗?

1 个答案:

答案 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()

nearest