CGAL的2D多边形分割

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加入

CGAL 6.0 - 2D Polygon Partitioning: User Manual

CGAL (Computational Geometry Algorithms Library) 是一个开源的计算机辅助几何处理软件库,它提供了丰富的几何算法,包括对多边形的操作。要实现封闭多边形的缩放,你可以按照以下步骤在CGAL中操作: 1. **加载必要的模块**:首先,需要包含`CGAL::Polygon_2<Kernel>`模块,其中`Kernel`是一个几何运算的抽象层。 ```cpp #include <CGAL/Polygon_2.h> #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> // 使用精确几何 ``` 2. **创建多边形**:创建一个`Polygon_2`对象,并提供多边形顶点的坐标,表示初始大小的多边形。 ```cpp CGAL::Polygon_2<Kernel> polygon; // 假设顶点存储在一个向量中 std::vector<Point_2> vertices = ...; // 闭合路径的顶点集合 polygon = CGAL::Polygon_2<Kernel>(vertices.begin(), vertices.end()); ``` 3. **定义缩放因子**:确定一个缩放因子,比如0.5,这将把多边形缩小到原来的一半。 4. **应用缩放**:使用`scale()`函数,传入缩放因子以及多边形的一个点作为参照点(通常是原点 `(0, 0)`),对多边形进行缩放。 ```cpp double scale_factor = 0.5; Point_2 origin(0, 0); CGAL::scale(polygon, scale_factor, origin); ``` 5. **验证结果**:最后检查缩放后的多边形是否按预期改变大小。 注意:这个过程假定你在使用CGAL的精确几何模式(`Exact_predicates_inexact_constructions_kernel`)。如果需要浮点精度,则可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值