2009-05-26 4 views

答えて

25

あなたはcalculate the right angle distance行にする必要があります。次に、 "close"が何であるかを定義し、それがその距離内にあるかどうかをテストする必要があります。

したい式は次のとおりです。Point-Line Distance (2-Dimensional)

d=|v^^·r|=(|(x_2-x_1)(y_1-y_0)-(x_1-x_0)(y_2-y_1)|)/(sqrt((x_2-x_1)^2+(y_2-y_1)^2)).

+9

注:線分を扱っている場合(つまり、無限に長い線ではない)、これは間違った結果をもたらす可能性があります:点はセグメントの端点から遠いかもしれませんが、通常の距離は小さいです... – MartinStettner

+0

また、 (x2 - x1)x(x1 - x0)|^2をD^2 | x2 - x1 |^2と比較すると、2つの平方根と1つの除算を乗算コストで節約する方が効率的です。 – Dave

+0

ありがとうMr.Alan しかし、リンクが機能しません! 私はあなたが前に置いた方程式を試しましたが、これは新しい点と穴の線ではなく線の最初の点の間の距離を私に与えます。 私の悪い言葉でよろしくお願いします。 Sincerly、 Wahid –

0

Googleはあなたの友達です。あなたはちょうど底に方程式を使用することができ、そこに行く。

0

基本的には、あなたのポイントとラインと交差する法線、つまりそのラインに垂直なラインを見つけ、そのラインに沿った距離を計算します。

+0

はい先生ですが、私は数学で非常に弱いので、私を助けて、私にこの方程式を教えてください。 –

+1

トップ1を参照してください。それはすべてそこにある。 –

0

近くにどのくらい近いですか?

ジオメトリによっては、必要な答えを得ることができます。次の手順に注意する必要があります。

y = mx + bという形であると仮定すると、あなたのポイントまでの最短距離は、あなたのポイントを横切る開始ライン(m1 = -1/m)に垂直なラインになります。

ここから、交点と問題の点との距離を計算します。

+0

わずかな重要な修正イアン、2の勾配は勾配線1(m1 = -1/m)の逆数 - –

+0

私の間違い...決して私の仕事をチェックすることは決してうまくいきません:-) –

2

@Alan Jacksonの答えはほぼ完璧ですが、最初の(そして最も投票された)コメントは、エンドポイントが正しく処理されないことを示唆しています。ポイントがセグメント上にあることを確認するには、セグメントが対角線であるボックスを作成し、ポイントが含まれているかどうかを確認します。ここで擬似コードはです:質問に、点AとBで構成される直線AB、および点Pを考えると

int buffer = 25;//this is the distance that you would still consider the point nearby 
Point topLeft = new Point(minimum(a.x, b.x), minimum(a.y, b.y)); 
Point bottomRight = new Point(maximum(a.x, b.x), maximum(a.y, b.y)); 
Rect box = new Rect(topLeft.x - buffer, topLeft.y - buffer, bottomRight.x + buffer, bottomRight.y + buffer); 
if (box.contains(p)) 
{ 
    //now run the test provided by Alan 
    if (test) 
     return true; 
} 
return false; 
+0

ありがとうございました:) –

0

は、その点に最も近いあなたのライン上のポイントを計算します。

線分がaとbであり、点がpであると仮定します。

これは、あなたがAとBの間にある線分をどのくらいまで(適切に境界があるか)示す「量」を与えます。

float nx = (amount * (b.x - a.x)) + a.x; 
    float ny = (amount * (b.y - a.y)) + a.y; 

ポイント(nx、ny)を与えます。

if (p.distance(nx,ny) > threshold) reject; 

それが0と

1の間の「量」を保つため、これは適切に使用すると、有界線分が境界を取り除くことしたくない場合は、線分の端部を超えて動作します量のために。残りのコードはまだ動作し、Aを超えてBの前に位置を計算します。

この質問は重複していると主張する別の質問がありましたが、私の解決策はポイントの位置を解決し、ユークリッド距離を解決するだけです(両方の問題を実際に解決します)。

a.distanceSq(b)もvABx vABx + vABy vAByとして実行することができます。

0

ここでは、そのトリックを行うpython関数です。 2次元または3次元(またはそれ以上)で動作し、特殊なケースなしに垂直線と水平線を処理する必要があります。 clipToSegmentをtrueに設定すると、投影された線分が指定された線分を超えている場合、返された点は両端にクリップされます。

def nearestPointOnLine(pt, r0, r1, clipToSegment = True): 
    r01 = r1 - r0   # vector from r0 to r1 
    d = np.linalg.norm(r01) # length of r01 
    r01u = r01/d   # unit vector from r0 to r1 
    r = pt - r0    # vector from r0 to pt 
    rid = np.dot(r, r01u) # projection (length) of r onto r01u 
    ri = r01u * rid   # projection vector 
    lpt = r0 + ri   # point on line 

    if clipToSegment:  # if projection is not on line segment 
     if rid > d:   # clip to endpoints if clipToSegment set 
      return r1 
     if rid < 0: 
      return r0 

    return lpt 

使用法:(点の距離[4,5] [2,4]から線分から[4,6]に)

r0 = np.array([2,4]) 
r1 = np.array([4,6]) 
rpt = np.array([4,5]) 
pt = nearestPointOnLine(rpt, r0, r1, True) 

dist = np.linalg.norm(rpt-pt) 
print('dist', dist) 
関連する問題