最善の策は、すべての線を反復処理して、点から線分までの最小距離を見つけることです。
ポイントからラインセグメントまでの距離を見つけるには、最初に任意のポイントP1
を選択P2
してライン上でポイントからラインまでの距離を見つけます(エンドポイントを使用するのが賢明かもしれません)。P1
次に、からあなたのポイントまでのベクトルを取り、内積がどこにあるP0
かを見つけます。この値をで割って、値を取得します。(P2-P1) . (P0 - P1)
.
||P2-P1||^2
r
これで、ポイントとしてを選択P1
した場合、が0から1の間であるP2
かどうかを簡単に確認できます。 が1より大きい場合は、が最も近いポイントであるため、距離はです。が0未満の場合、は最も近いポイントであるため、距離はです。r
r
P2
||P0-P2||
r
P1
||P0-P1||
の場合0<r<1
、あなたの距離はsqrt(||P0-P1||^2 - (r * ||P2-P1||)^2)
擬似コードは次のとおりです。
for p1, p2 in vertices:
var r = dotProduct(vector(p2 - p1), vector(x - p1))
//x is the point you're looking for
r /= (magnitude(vector(p2 - p1)) ** 2)
if r < 0:
var dist = magnitude(vector(x - p1))
else if r > 1:
dist = magnitude(vector(p2 - x))
else:
dist = sqrt(magnitude(vector(x - p1)) ^ 2 - (r * magnitude(vector(p2-p1))) ^ 2)
minDist = min(dist,minDist)