最好的办法是遍历所有线并找到从点到线段的最小距离。
要找到从点到线段的距离,首先通过选择任意点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)