CGAL的2D凸包和极值点

1、介绍

        子集S⊆R2是凸的,如果对于集合中的任意两点p和q,具有端点p和q的线段包含在S中。集合S的凸包是包含S的最小凸集。点集p的凸包为顶点在p中的凸多边形。如果一组点只由极值点组成,则称其为强凸点。

        本章描述了CGAL中提供的用于生成二维凸包的函数,以及用于检查点集是否是强凸的函数。还有许多函数被描述用于计算特定的极值点和外壳点的子序列,例如一组点的下外壳和上外壳。

        强凸点(Strongly convex point)是指一个点集中的点,其构成的凸包只包含这个点集中的点,即该点集中的所有点都在其凸包上。换句话说,强凸点是指在该点集构成的凸包中,没有其他点在其外部。

        对于一个点集来说,如果它只包含强凸点,那么这个点集就是强凸的。强凸集中的所有点都是极点,即它们都是凸包的顶点。

        在计算几何中,强凸集和强凸点是非常重要的概念,因为它们可以帮助我们更好地理解和处理二维空间中的凸包问题。

2、凸包

        CGAL为计算二维点集中反时针序列的极点(即凸包上的点的反时针序列)提供了几种经典算法的实现。这些算法具有不同的渐近运行时间,并需要稍微不同的几何原语集。因此,您可以选择最适合您环境的算法。

        每个凸包函数都向用户呈现相同的接口。也就是说,用户提供一对迭代器,first和beyond,一个输出迭代器结果,以及一个traits类特性。在[first,beyond)范围内的点定义了要计算其凸包的输入点。极点的反时针序列被写入到位置结果开始的序列中,并返回结果的逾越-超越迭代器。这些函数中的traits类指定输入点的类型以及算法所需几何原语的类型。所有函数都提供了一个接口,在这个接口中不需要指定此类,并且默认为输入点类型所在的核中定义的类型和操作。

        凸包是一个几何概念,它是一个包含给定点集合的所有极端的简单多边形。这段文本中列举了几种计算凸包的算法,包括Bykat算法、Akl和Toussaint算法、Graham-Andrew扫描算法、Jarvis march算法、Eddy算法和Melkman算法。这些算法各有不同的时间复杂度和适用场景,因此需要根据具体情况选择合适的算法。例如,Bykat的算法适用于处理大量的输入点,而Akl和Toussaint的算法在处理大量数据时可能效率较低。同样,Graham-Andrew扫描算法和Jarvis march算法也是常用的凸包计算方法。Eddy的算法和Melkman的算法则是针对特定情况设计的算法。

3、Graham Andrew算法范例

        在示例中,使用Graham_Andrew算法从标准输入读取的点数据构建凸包。生成的凸多边形显示在标准输出控制台上。通过用ch_bykat()等其他函数替换函数ch_graham_andrew()也可以获得相同的结果。

4、 Property Map的范例

        在下中,我们有一个点的向量作为输入,我们检索凸包上的点的索引。凸包函数以特征类作为第四个自变量,该特征类必须是概念ConvexHullTraits_2的模型。它提供了诸如方向测试之类的谓词。与Pointer_property_map相结合的类Convex_hul_traits_adapter_2就是这样一个模型。索引i就是“点”,适配器在点[i]上执行谓词。

5、极值点和凸包子序列

        除了计算凸包的函数之外,还有许多计算与凸包相关的点和序列的函数。

        lower_hull_points_2()和upper_hull_points_2()函数提供计算下凸包和上凸包的极点反时针序列的功能。这些函数中使用的算法是Andrew变体的Graham扫描算法[3],[9],其最坏情况下的运行时间为O(nlogn)。

        还有可用于计算凸包极点序列的特定子序列的函数。ch_jarvis_march()函数生成给定一对点之间的极点反时针有序子序列,而ch_graham_andrew_scan()函数计算不是由第一个和最后一个输入点定义的线的左侧的极点排序序列。

        最后,有一组函数(ch_nswe_point()、ch_ns_point()、ch_we_point()、ch_n_point()、ch_s_point()、ch_w_point()、ch_e_point())用于计算2D点集在坐标方向上的极点。

6、特征类

        每个用于计算凸包或极点的函数都由一个特性类进行参数化,这个特性类指定了计算中要使用的类型和几何原始对象。库中提供了几个2D特性类的实现。Convex_hull_traits_2类对应于默认的特性类,它提供了输入点所在2D CGAL内核中的类型和谓词。

  Convex_hull_constructive_traits_2是第二个特性类,它基于CGAL原始对象,但与Convex_hull_traits_2不同的是,它的一些原始对象会重用中间结果来加速计算。

        此外,2D和3D线性几何内核提供了三个投影特性类(Projection_traits_xy_3Projection_traits_xz_3Projection_traits_yz_3),这些类可以用于计算一组三维点被投影到每个坐标平面后的凸包。这是在处理三维数据时经常使用的一种技术,通过将数据投影到不同的坐标平面,可以简化计算或更容易地找到凸包等几何特性。

7、凸性检查

        is_ccw_strongly_convex_2()is_cw_strongly_convex_2(),它们用于检查给定的二维点序列是否形成一个按逆时针(或顺时针)排列的强凸多边形。这些函数用于二维凸包函数的后验测试条件。

        如果你想保留共线的点,你可以使用二维Delaunay三角剖分,如下面的例子所示。这样的序列不是强凸的。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值