最好的办法是遍历所有线并找到从点到线段的最小距离。
要找到从点到线段的距离,首先通过选择任意点P1
和线上的点来找到从点到线的距离P2
(使用端点可能是明智的)。然后将向量从P1
到您的点P0
并找到点积(P2-P1) . (P0 - P1)
在哪里。.
将此值除以||P2-P1||^2
得到一个值r
。
现在,如果您选择P1
和P2
作为您的点,您可以简单地检查是否r
在 0 和 1 之间。如果r
大于 1,那么P2
是最近的点,所以您的距离是||P0-P2||
。如果r
小于 0,那么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)