【问题标题】:Find point in polygon在多边形中查找点
【发布时间】:2016-07-07 11:12:09
【问题描述】:

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

   class Point
   {
      public double X, Y;
   }

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

【问题讨论】:

  • 你尝试过什么吗? SO 不是代码服务。那么你的想法是什么?应该采取哪些步骤来获得你想要的东西,也许是一些伪代码?
  • 如果您想要多边形中由其顶点给出的任何点,则只需返回第一个顶点。如果您想要任何内部点,不包括顶点,则使用两点 (x0,y0)、(x1,y1)en.wikipedia.org/wiki/Linear_equation#Two-point_form 的直线方程,并从 x0 到 x1 获取点。要知道是否有任何一点是内部的,请阅读这篇文章stackoverflow.com/questions/4243042/c-sharp-point-in-polygon,但这超出了您的需要。
  • 你读过维基文章吗? en.wikipedia.org/wiki/Point_in_polygon
  • @derloopkat 通过两个任意点获取线方程不适用于非凸多边形,因为并非这条线上的每个点都在多边形内
  • 从给定点确定内外有众所周知的解决方案。但是选择一个内部的任意点,可能并不简单,而且更像是数学/算法问题而不是编程问题。我会从探索多边形每个边的中点法线上接近的随机点的想法开始,直到我找到一个在里面,但应该有更好的确定性解决方案。

标签: c# computational-geometry


【解决方案1】:

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

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

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

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

勘误:

在最坏的情况下,可能有 O(N) 个交叉点,排序会进行 O(N Log(N)) 次操作。在实践中,这种情况很少见。


旁注:

如果您有额外的要求,即内部点应该与边缘之间的距离足够,您可以执行多边形(内侧)的偏移,并使用相同的过程在偏移量内选择一个点。不过,偏移量计算绝非易事。

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

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2018-01-23
    • 2013-04-23
    • 2010-12-03
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多