从点到多边形的距离

时间:2012-06-11 16:15:48

标签: algorithm geometry

我正在尝试确定2D空间中从点到多边形的距离。该点可以在多边形内部或外部;多边形可以是凸面或凹面。

如果该点位于多边形内或多边形外部且距离小于用户定义的常量d,则该过程应返回True;否则False

我发现了一个类似的问题:Distance from a point to a polyhedron or to a polygon。但是,在我的情况下,空间是2D,多边形可以是凹的,所以它与那个不同。

我认为应该有一个比d偏移多边形并确定它在多边形内部或外部更简单的方法。

任何算法,代码或提示,我都会感激不尽。

5 个答案:

答案 0 :(得分:19)

根据@ jcaron的评论更正

最好的办法是迭代所有线条,找到从点到线段的最小距离。

要查找从点到线段的距离,首先要通过在线上拾取任意点P1P2来找到从点到线的距离(这可能是明智的使用你的终端)。然后将P1中的向量移到您的P0点,找到(P2-P1) . (P0 - P1),其中.是点积。将此值除以||P2-P1||^2并获得值r

现在,如果您选择P1P2作为积分,则只需检查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的通用实现。它具有有关每种情况下的复杂性的信息,在您遇到问题的情况下,它是线性的。

几天前,我也在寻找解决此问题的方法,我想分享这一发现。希望对别人有帮助。