我正在尝试确定2D空间中从点到多边形的距离。该点可以在多边形内部或外部;多边形可以是凸面或凹面。
如果该点位于多边形内或多边形外部且距离小于用户定义的常量d
,则该过程应返回True
;否则False
。
我发现了一个类似的问题:Distance from a point to a polyhedron or to a polygon。但是,在我的情况下,空间是2D,多边形可以是凹的,所以它与那个不同。
我认为应该有一个比d
偏移多边形并确定它在多边形内部或外部更简单的方法。
任何算法,代码或提示,我都会感激不尽。
答案 0 :(得分:19)
根据@ jcaron的评论更正
最好的办法是迭代所有线条,找到从点到线段的最小距离。
要查找从点到线段的距离,首先要通过在线上拾取任意点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))
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)
答案 1 :(得分:2)
如果您有一个工作点到线段距离函数,您可以使用它来计算从点到多边形的每个边的距离。当然,您必须首先检查点是否在多边形内。
答案 2 :(得分:2)
您需要快速还是简单?
在边缘情况下是否必须始终绝对正确,或者足够好大部分时间都可以吗?
典型的解决方案是找到每个顶点的距离并找到具有最小值的对(请注意,对于凸多边形之外的点,这些可能不相邻),然后检查每个段的点到线交点。
对于大型复杂形状,您还可以存储近似多边形边界框(矩形或六边形),并在检查更多细节之前找到最近的边。
您可能还需要代码来处理完全一行的特殊情况。
答案 3 :(得分:0)
我可以帮助你解决这个问题:
和一些评论:
答案 4 :(得分:0)
我不知道其余答案在性能上的区别,但是在boost C ++库中有一个名为distance的通用实现。它具有有关每种情况下的复杂性的信息,在您遇到问题的情况下,它是线性的。
几天前,我也在寻找解决此问题的方法,我想分享这一发现。希望对别人有帮助。