对于多边形,点以逆时针方式给出。对于孔,点以时钟方式给出。那么给定一个多边形列表,如何构造所有带孔的多边形?
以下是多边形列表的一些前提条件:
如何设计构造带孔的多边形的算法?
我正在寻找一种通用算法,因此欢迎使用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)
{
}
答案 0 :(得分:2)
由于浮点舍入误差,多边形测试中的点很容易受到攻击。它们通常只适用于非平凡的多边形。
更强大的方法应基于扫描线算法,其中顶点首先根据其x和y值进行排序。然后扫描(或扫描)线移动,例如。从左到右。然后,该算法通常通过在其左顶点“撞击”扫描线时添加一条线来保持与扫描线相交的线列表,并在其右顶点击中该线时将其移除。
在扫描线的每次移动之后,更新当前线与扫描线的交点,并且根据交叉点的y值重新排序线。每当在排序操作期间需要重新排序两行时,这意味着他们有一个交叉点,然后可以记录。
找到所有交叉点后,可以可靠地识别轮廓和孔。
以下项目使用此方法:
还有其他网站,以下网站(推广PolyBoolean库)比较了最重要的网站:http://www.complex-a5.ru/polyboolean/comp.html。
正如警告:我自己实现了一个支持布尔运算和空洞检测的多边形库。这个库正在商业产品中使用,我花了几年时间(!)来微调算法,以确保在任何给定的输入多边形上尽可能正确的结果(其他库可能快几个月,但失败了一些输入数据)。实际上,单一方法算法可能无法解决所有可能的问题,因此我必须实现几个方法。
祝你好运!