2016-12-06 19 views
3

私はConvexHullクラスのscipyを使用して、一連の点の凸包を作成しています。私は凸包から新しい点Pの最小距離を計算する方法に興味があります。凸包への距離を計算する

np.max(np.dot(self.equations[:, :-1], points.T).T + self.equations[:, -1], axis=-1) 
:インターネットの助けを借りて、私はポイント Pまたは点の集合 ポイント凸包ファセットへの距離を計算するために、この式を思い付い自分で少しひねると

あなたがトンを見ることができるように

Distance to Convex Hull

2Dで凸包のために上記の式は、次のプロットになります結果はかなり良く、凸包内の点を修正します(ここでの距離は負で、-1で乗算する必要があります)。また、ファセットに最も近いが凸包の頂点に最も近い点については正しくない点についても正しい。 (これらの領域に点線でマークを付けました)これらの点について、正しい最小距離は凸包の頂点までの最小距離です。

どのように正確にn次元における点Pまたは点のセットため凸包に最小距離を計算する頂点のファセットに最も近い、または最も近くにある点を区別することができますスペース(少なくとも3D)?

+0

が凸包セグメントのそれぞれのセグメント式にポイントを使用するように指定された場合最小値を取る – user4421975

+0

@ user4421975あなたのコメントを精緻化できますか?セグメント式のポイントは何ですか?各点の – Woltan

+0

は、http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-a-segmentを使用して、凸包の各線分までの距離を計算し、最も近いものを取る – user4421975

答えて

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) 
+0

ありがとうございます。これもn次元空間に変換可能ですか?または少なくとも3D?私は私の質問に言及しなかったので、それに応じて質問を編集します。 – Woltan

+0

私はビットをGoogleに合わせて3dに合うように数式を変更できると確信しています – user4421975