最善の策は、すべての線を反復処理して、点から線分までの最小距離を見つけることです。
ポイントからラインセグメントまでの距離を見つけるには、最初に任意のポイントP1を選択P2してライン上でポイントからラインまでの距離を見つけます(エンドポイントを使用するのが賢明かもしれません)。P1次に、からあなたのポイントまでのベクトルを取り、内積がどこにあるP0かを見つけます。この値をで割って、値を取得します。(P2-P1) . (P0 - P1).||P2-P1||^2r
これで、ポイントとしてを選択P1した場合、が0から1の間であるP2かどうかを簡単に確認できます。 が1より大きい場合は、が最も近いポイントであるため、距離はです。が0未満の場合、は最も近いポイントであるため、距離はです。rrP2||P0-P2||rP1||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)