1、介绍
对多边形P的分割是一组多边形,使得这些多边形的内部不相互交叉,并且这些多边形的并集等于原始多边形P的内部。本章描述了将平面多边形分割为两种类型的子多边形-y单调多边形和凸多边形的函数。分割不会引入新的(Steiner)顶点。
所有分割函数都向用户提供相同的接口。也就是说,用户提供一个输入迭代器对first和beyond,一个输出迭代器result和一个特性类traits。范围[first, beyond)中的点假定定义一个简单多边形,其顶点按逆时针顺序排列。计算出的分割多边形的顶点也按逆时针方向排列,并写入位置result处的序列,结果的序列的past-the-end迭代器被返回。这些函数用于特性类指定输入点的类型和输出多边形的类型,以及几个其他类型和函数对象,这是各种算法所必需的。
2、单调分割
y-单调多边形是一个多边形,其顶点v1,…,vn可以分成两条链v1,…,vk和vk,…,vn,v1,使得任何水平线最多与其中一条链相交一次。为了产生给定多边形的y-单调分区,在[1]中提出的扫线算法由函数y_monotone_partition_2()实现。该算法在O(nlogn)时间内运行,需要O(n)空间。该算法不保证相对于最优数量的多边形数量的界限。
为了检查 y_monotone_partition_2() 产生的分区的有效性,我们提供了一个函数 is_y_monotone_2(),它确定二维点序列是否定义了 y 单调多边形。有关这些函数使用的示例,请参阅相应的参考页面。
单调多边形是指一个多边形的所有顶点按照相同的顺序连接而成的闭合图形。如果一个多边形基于它的y坐标值最大和最小的两个顶点可以将它的边分成两个单调边序列,则该多边形称为Y单调多边形。
3、凸分割
提供了三个函数来生成多边形的凸划分。一个函数生成块数最优的划分。另外两个函数生成近似最优的凸划分。这两个函数都通过先将多边形分解为更简单的多边形来生成凸分解;第一个使用三角剖分,第二个使用单调划分。这两个函数都保证它们生成的凸块不超过最优数量的四倍,但它们的运行时间复杂性不同。虽然基于三角剖分的近似算法通常会产生较少的凸块,但情况并非总是如此。
4、范例
分割一个多边形
5、实施历史
CGAL5.0加入