在多边形中查找点

时间:2016-07-07 11:12:10

标签: c# computational-geometry

我有一个简单的二维多边形,顶点为3..n。我需要在这个多边形的内部(而不是边界)找到一个任意点。我怎么找到一个? 对于凸多边形,这个问题是微不足道的:只需要取三个不在同一条线上的相邻点(因此它们形成一个三角形)。该三角形的中点保证位于多边形内。但这种方法不适用于非凸多边形。

   class Point
   {
      public double X, Y;
   }

   Point GetPointInPolygon(Point[] polygon)
   {
      .....
   }

1 个答案:

答案 0 :(得分:4)

在极值之间的某个纵坐标上绘制一条水平线(以确保穿过多边形)。计算此线与多边形轮廓的所有交点。这是在多边形边上的一个简单循环中完成的,您可以在其中检测边的变化。

你会发现偶数个十字路口。通过增加横坐标对它们进行排序,并选择偶数和奇数交点之间的任何点。

这需要时间O(N),这是最佳的。

enter image description here

如您所见,通过光线投射进行的多边形点测试报告为真。

<强>勘误:

在最坏的情况下,可能存在O(N)个交叉点,并且排序将采用O(N Log(N))运算。在实践中,这很少得到满足。

旁注:

如果你有一个额外的要求,内部点应该与边缘足够的距离,你可以执行多边形的偏移(内侧),并使用相同的步骤在偏移内选择一个点。但是,偏移计算绝不是微不足道的。

可能的偏移距离是有界的,但我不知道如何找到这个边界。它将对应于“最深”的点。