给定多边形列表,构造带孔的多边形

时间:2011-01-17 07:13:15

标签: c# c++ matlab geometry computational-geometry

对于多边形,点以逆时针方式给出。对于孔,点以时钟方式给出。那么给定一个多边形列表,如何构造所有带孔的多边形?

以下是多边形列表的一些前提条件:

  1. 一个多边形可以包含多个孔,但多边形内必须包含一个孔。
  2. 一个洞不能包含一个或多个多边形。
  3. 所有洞必须位于多边形内,而不是位于其外部
  4. 孔的边缘可以触及多边形。
  5. 并且所有多边形和孔都不得与其他多边形/孔相交,尽管它们可以相互接触。
  6. 多边形/孔可以是凸凹。
  7. 如何设计构造带孔的多边形的算法?

    我正在寻找一种通用算法,因此欢迎使用C#,C ++和matlab形式的任何代码。

    编辑:这是我的输入(在C#中)

    public class PolygonWithHoles
    {
       public List<Point> OuterBoundary;
       public List<List<Point>> Holes;
    }
    
    
    //input: a list of point list. If the point list constructs a polygon in Counter clock wise, then it is a general polygon, else it is a holes
    public List<PolygonWithHoles> ConstuctPolyHoles(List<List<Point>> Polys)
    {
    }
    

1 个答案:

答案 0 :(得分:2)

由于浮点舍入误差,多边形测试中的点很容易受到攻击。它们通常只适用于非平凡的多边形。

更强大的方法应基于扫描线算法,其中顶点首先根据其x和y值进行排序。然后扫描(或扫描)线移动,例如。从左到右。然后,该算法通常通过在其左顶点“撞击”扫描线时添加一条线来保持与扫描线相交的线列表,并在其右顶点击中该线时将其移除。

在扫描线的每次移动之后,更新当前线与扫描线的交点,并且根据交叉点的y值重新排序线。每当在排序操作期间需要重新排序两行时,这意味着他们有一个交叉点,然后可以记录。

找到所有交叉点后,可以可靠地识别轮廓和孔。

以下项目使用此方法:

还有其他网站,以下网站(推广PolyBoolean库)比较了最重要的网站:http://www.complex-a5.ru/polyboolean/comp.html

正如警告:我自己实现了一个支持布尔运算和空洞检测的多边形库。这个库正在商业产品中使用,我花了几年时间(!)来微调算法,以确保在任何给定的输入多边形上尽可能正确的结果(其他库可能快几个月,但失败了一些输入数据)。实际上,单一方法算法可能无法解决所有可能的问题,因此我必须实现几个方法。

祝你好运!