计算到凸包的距离

时间:2016-12-06 16:23:26

标签: python numpy scipy distance convex-hull

我使用ConvexHull类scipy为一组点构造一个凸包。我对从凸包计算新点 P 的最小距离感兴趣。

借助互联网和我自己的一点调整,我想出了这个公式来计算点 P 或一组点的距离凸壳面:

np.max(np.dot(self.equations[:, :-1], points.T).T + self.equations[:, -1], axis=-1)

对于2D中的凸包,上面的等式将产生以下图:

Distance to Convex Hull

正如您所看到的,结果非常好并且对于凸包内的点是正确的(这里的距离是负的,需要乘以 -1 )。对于最接近小平面但对于最接近凸包顶点的点不正确的点也是正确的。 (我用虚线标记了这些区域)对于这些点,正确的最小距离是到凸包顶点的最小距离。

如何区分最接近小平面或最接近顶点的点,以正确计算点 P 或一组点点的凸包的最小距离在n维空间(至少3D)?

1 个答案:

答案 0 :(得分:1)

如果凸包的点是作为NX2阵列给出的,则该点为p = [x,y]

import math
#from http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment
def dist(x1,y1, x2,y2, x3,y3): # x3,y3 is the point
    px = x2-x1
    py = y2-y1

    something = px*px + py*py

    u =  ((x3 - x1) * px + (y3 - y1) * py) / float(something)

    if u > 1:
        u = 1
    elif u < 0:
        u = 0

    x = x1 + u * px
    y = y1 + u * py

    dx = x - x3
    dy = y - y3

    # Note: If the actual distance does not matter,
    # if you only want to compare what this function
    # returns to other results of this function, you
    # can just return the squared distance instead
    # (i.e. remove the sqrt) to gain a little performance

    dist = math.sqrt(dx*dx + dy*dy)

    return dist

dists=[]
for i in range(len(points)-1):
    dists.append(dist(points[i][0],points[i][1],points[i+1][0],points[i+1][1],p[0],p[1]))
dist = min(dists)