CGAL的3D凸包

本文介绍了在CGAL库中处理三维空间凸包的方法,包括静态算法的quickhull函数、处理各种几何类型和退化情况的traits类、极值点和半空间交点计算,以及动态维护凸包的Delaunay_triangulation_3类的示例和性能比较。
摘要由CSDN通过智能技术生成

1、介绍

        A subset S ⊆ R3 是凸集,如果对于集合中的任意两个点 p 和 q,连接这两点的线段都包含在 S 中。一个集合 S 的凸包是包含 S 的最小的凸集。一个集合 P ⊆ R3 中的点构成的凸包是一个以 P 中的点为顶点的凸多面体。P 中的点被称为极点(相对于 P),如果它凸包的一个顶点。一组只包含极点的点集被称为强凸集。

        本章将介绍在 CGAL 中用于在三维空间中计算凸包的功能,以及用于检查一组点是否为强凸的功能。在 CGAL 中,可以通过两种方式来计算一组点在三维空间中的凸包:使用静态算法或通过三角剖分实现完全动态计算。 

2、静态凸包结构

        函数 convex_hull_3() 提供了 quickhull 算法的实现。该函数有两个版本,一个可以在已知输出是一个多面体(即有三个以上的点,并且它们不是共线的)时使用,另一个处理所有退化情况并返回一个对象,该对象可能是点、线段、三角形或多面体。这两个版本都接受一系列输入迭代器,这些迭代器定义了要计算其凸包的一组点,以及一个 traits 类,该类定义了计算凸包时使用的几何类型和谓词。

2.1、 traits 类

        函数 convex_hull_3() 由一个 traits 类参数化,该类指定了计算中使用的类型和几何基元。由于该函数从三个输入点构造 3D 平面,我们不能简单地将具有不精确构造的内核作为 traits 类的可选参数传递。

        如果使用具有精确谓词和非精确构造的核的输入点,并且期望得到一个经过认证的结果,则应使用类 Convex_hull_traits_3(R 为输入核)。如果来自核的构造是精确的,则可以直接将该核用作 traits 类。

        请注意,默认的traits类考虑到了这一点,也就是说,上述考虑仅对自定义traits类重要。

2.2、极值点

        除了conex_hull_3()函数外,在只需要凸包上的点(没有连通性信息)的情况下,还提供了函数extreme_points_3()。此外,还提供了traits类适配器CGAL::Extreme_points_traits_adapter_3,以便获得索引,或者更一般地,获得与凸包上的3D点相关联的任何给定实体。

2.3、半空间交点

        函数 halfspace_intersection_3() 和 halfspace_intersection_with_constructions_3() 使用凸包算法和对偶性来计算半空间列表的交集。第一个版本没有显式计算对偶点:traits 类处理了这个问题。第二个版本构造了这些点,因此鲁棒性较差,但计算速度更快。

        为了计算交点,需要一个内部点。它既可以由用户给出,也可以使用线性规划来计算。请注意,由于线性规划的分辨率,第二种方法速度较慢。

2.4、凸性检查

        函数is_strongly_convex_3()实现了算法,用于确定给定多面体的顶点是否构成强凸点集。该函数用于convex_hull_3()的后置条件测试。

3、动态凸包结构

        使用Delaunay_triangulation_3类可以实现凸包的全动态维护。此类支持点(即三角测量的顶点)的插入和移除,并且凸包边只是无限面的有限边。以下示例说明了凸包的动态构造。首先,生成来自某个半径的球体的随机点,并将其插入三角测量中。然后通过计算入射到无限顶点的三角测量顶点的数量来获得凸包的点数。移除一些点,然后确定船体上剩余的点的数量。请注意,与三角测量的无限顶点相关的顶点在凸包上,但可能并非所有顶点都是凸包的顶点。

4、演示

        下面,我们比较了两种计算三维凸包的方法的运行时间。对于静态版本(使用 convex_hull_3())和动态版本(使用 Delaunay_triangulation_3 和 convex_hull_3_to_face_graph()),使用的内核是 Exact_predicates_inexact_constructions_kernel。

        为了计算单位球内一百万个随机点的凸包,静态方法需要 1.63 秒,而动态方法需要 9.50 秒。为了计算有 192135 个点的模型的凸包,静态方法需要 0.18 秒,而动态方法需要 1.90 秒。

     CGAL 5.6 - 3D Convex Hulls: User Manual

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值