如何检测闭环多边形的有界区域?

时间:2016-08-03 19:02:54

标签: algorithm geometry polygons point-in-polygon

我在2D空间中给出了一组有序的点作为前一个过程的输出。坐标点将以((x0,y0),(x1,y1),...,(xn,yn))的形式给出,其中最后一个坐标对将是第一对的重复(即x0 = xn和y0 = yn)。通过这种方式,我知道当我重新遇到相同的坐标时,我已经做了一个闭环。我希望能够通过多边形检测封闭区域。如果给出单个闭环,则输出应该是该闭环的封闭区域。现在说我有一组单独的点,类似于第一组。如果给出了一组许多闭环多边形,那么如果每个多边形在空间上彼此分开,则输出应该是每个封闭区域。但是,如果一些多边形相互包围,它应该是两个多边形之间的区域。例如,如果我在另一个中有一个闭环多边形,则输出区域应该在它们之间(或换句话说,由较大的一个包围的区域减去较小的一个所包围的区域)。如果我在一个较大的一个中有一个以上的闭环多边形,它应该是由较大的一个包围的区域减去较小的一个所包围的所有区域。)

对于我有一个由区域B包围的区域A,其中B被区域C包围的情况,有三个不同的区域。

  1. 区域C减去区域B(由多边形1限制在外面)
  2. 区域B减去区域A(由多边形2限定在外面)
  3. 区域A(由多边形3限制在外面)
  4. 在这三个地区中,我只想要区域1)和区域3)。我不采用区域2)的原因是因为对于我的2D平面上的所有有界区域,最外面的多边形总是表示相关区域的边界,并且产生代表我的闭环多边形的坐标集的输入将永远不会有给出了多边形2的点,如果在末端区域1)和区域2)被组合。相反,它只给了我多边形1和多边形3,类似于我上面描述的情况。

    nested polygons

    总之,   - 我获得了足够的信息来了解2D平面上一组闭环多边形的所有坐标点,并且它们可以相互区分。   - 我需要开发一种算法,该算法将接受整个闭环多边形集并返回足够的信息来描述有界区域。在考虑这个问题时,我认为我想要的输出是知道闭环多边形的每一个线段,该线段的哪一边是多边形的内部和外部。   - 它应该能够解决我在多边形内部有多边形的情况。   - 闭环多边形永远不会共享任何点。每组坐标点对于多边形都是唯一的。

    我最初的想法是计算多边形的质心,然后将所有线段与质心进行比较,但我不认为这适用于所有情况。

2 个答案:

答案 0 :(得分:1)

根据输入描述判断,将输入流拆分为单独的多边形是一项微不足道的任务。

之后,为了"返回足够的信息来描述有界区域"您可以从多边形构建以下数据结构:

  1. 将所有多边形分为两类:主要多边形孔多边形
  2. 主要多边形是......好的,有界区域的外部边界。它将有界区域的内部与外部世界区分开来。
  3. 孔多边形是一个描述某个主多边形中的孔的多边形。
  4. 每个孔多边形只与一个主多边形
  5. 相关联
  6. 每个主多边形与零个或多个孔多边形相关联
  7. 或者,您可以顺时针顺序排列主多边形中的顶点和孔多边形中的顶点。但这并不是绝对必要的,以满足"描述有界区域的正式要求"
  8. 生成的结构是双层的:您最终会得到一个主多边形列表,每个主多边形可能包含一个洞的列表。

    在您的示例中,您有4个主要多边形。其中一个包含两个孔多边形。

    因此,您需要做的就是识别孔多边形并将它们与主多边形正确关联。

    解决此任务的工业强度方法是将扫描线算法应用于输入多边形。它可以轻松地对 main hole 多边形进行分类,并在它们之间建立正确的关联。

    ad-hoc算法可能如下所示

    1. 按面积增加的顺序对所有多边形进行排序
    2. 对于排序顺序中的每个多边形p
      1. v
      2. 的任何顶点p
      3. 执行"内部" v对面积大于p的所有多边形的测试(例如,通过使用简单的奇偶交点测试:How can I determine whether a 2D Point is within a Polygon?
      4. 如果包含v的多边形的数量为奇数,则p为孔多边形。否则,p是主要多边形
      5. 如果p是孔多边形,则包含v的最小区域多边形是其关联的主多边形。
    3. 那就是它。

答案 1 :(得分:0)

  

我认为我想要的输出是知道闭环多边形的每一个线段,该线段的哪一边是多边形的内部和外部。

  1. 计算线段的法线(垂直线)。
  2. 计算线段的中点(任何点都可以)。
  3. 将每个其他线段与从法线方向的中点投射的光线相交。
  4. 直观地说,每个交叉点意味着进入或退出另一个多边形。由于最后光线将在所有多边形之外,我们可以推断出如果光线与偶数个其他线段相交,则由法线指示的线段的侧面位于多边形的外侧。如果是奇数,它就在里面。

    有几个棘手的情况:一个是光线与两个相连线段的终点精确相交的地方。小心,只将其计为一个交叉点。另一种情况是光线平行于另一个线段并与其完全重叠。这应该算作两个交叉点。

    有更高效的算法(例如涉及三角测量),但这个算法最简单。