如何通过线段拆分一般闭合多边形

时间:2015-03-10 14:41:07

标签: c++ algorithm boost polygon boost-polygon

我需要一个好的(强大的)算法,用于通过线段将多边形分成两组(左/右)。我的多边形表示只是一个整数坐标列表(顺序时钟顺序,从不自相交),线段由起点和终点表示。该行始终在多边形外部开始和结束,即与多边形相交偶数次。

以下是一个例子:

The polygon should be split into two sets of two polygons each.

算法的输出应该是两组(顺时针行进):

  • 左:HABCH,FGDEF
  • 右:HCDGH,BAB,FEF

我可以通过迭代多边形并检查多边形线段是否穿过线来识别点A-H,注意遵守边界情况。我还可以确定每条多线所属的哪一侧。但是,对于我的生活,我不能决定如何将这些片段串联在一起。

在你建议使用通用剪辑库之前:我正在使用提升多边形,它非常善于相互修剪多边形,但是我没有找到任何可以让你在一个线段上剪切多边形的库而它不是通常可以将线段转换为我可以剪辑的多边形。

编辑:我错过了FEF以及多边形可以在线段两侧都有零件的事实。

3 个答案:

答案 0 :(得分:0)

For each intersection of the polygon border with the line segment:
    Add a new point to the polygon.
    Remember the new points in a new-point set.

Add the original polygon to the polygon set.

For each pair of points in the new-point set:
    For each polygon in the current polygon set:
        If the line segment between the points is completely inside the polygon.
           Replace the polygon in the polygon set with two polygons 
           generated by dividing the original polygon along the line 
           segment between the points.

For each polygon in the polygon set:
    Add it to the Left result set or the Right result set.
    (Note this may not be possible.  
        Consider your example of the segment starting between C and F: 
        You will end up with a polygon (GABCFG) that touches both 
        sides of the dividing segment.  Is that a Left or a Right?

答案 1 :(得分:0)

我已经解决了类似的问题,但我放弃了试图变得聪明。

  1. 围绕所有顶点运行,使它们成为连接的线段, 每次与...相交时都以新点开始一个新的段 切割线。
  2. 查找共享终点的所有细分,并将它们重新连接成一个较长的细分。
  3. 连接所有开放端。

答案 2 :(得分:0)

好的,这是一个如何得出答案的相当简单的方法:

从顺时针行进轮廓所订购的交叉点开始:

  • ABCDEFGH

根据距离行首的距离对它们进行排序:

  • HCFEDGBA

我们还需要记住每个点是否是从左到右或从右到左的交叉点。

  • 从任何一点开始。让我们说G.顺时针方向跟随轮廓并添加GH 到当前的多边形。
  • 现在我们需要沿着这条路走。该 方向取决于我们的哪一侧。我们在 右边,所以我们需要选择H中右边的值 排序集:C。将HC添加到当前多边形。
  • 顺时针方向跟随轮廓并将CD添加到当前多边形。
  • 我们在右侧,因此我们需要在有序集合中选择D右侧的值:G。将DG添加到当前多边形。
  • 我们现在已经达到了 起点,所以让我们保存多边形(GHCDG)并删除使用过的 列表中的点。
  • 从另一点开始。