本人接触CGAL已经有两年多了,但在工作中用到的不是很多,且只是用其中一个小小的功能,所以也没有过多的关注Kernel的组成,但在最近的项目中,因为调用了大量CGAL中的函数,每一个函数用到的Kernel不相同,比如,都是Point_2,有的用Exact_predicates_exact_constructions
,有的是用Cartesian<double>
,所以凸显出了很多知识结构方面的问题,本文中,主要介绍最基础的Kernel模块。(如有不同见解,欢迎下方评论)
为什么要先介绍Kernel,原因很简单,因为这里面隐藏着计算几何中一个大坑--精度问题,举个例子,1.0 + 1.0 = 2.0
,从人脑的角度来看,没毛病,但在计算机内部,这就是很大的问题,因为会牵扯到一个叫做“浮点精度”的问题,在计算机内部,1.0
可能不是1.0
,而是0.99999
或者1.00001
,所以,0.99999 + 0.99999 != 2.0
,所以这就要求我们在进行C/C++
写程序时,要避免出现 A == B
这种式子,若要实现此功能,可以使用 abs(A - B) < 0.001
,这样的话,就可以有效的避免浮点精度产生的问题,而Kernel的选择,也与此有关。
Kernel包含基本的几何对象(点、线、面等)以及对这些对象的操作,这些对象被实现成基本的类,从而增强灵活性与适用性。但在目前的使用过程中,最为突出的或者是唯一感到差别的就是几何对象的精度。
先介绍下最常用(目前接触到的)的几个Kernel:
- CGAL::Simple_cartesian<double>--最容易理解的Kernel,可以简单的理解为数据精度为double,当然也可以设置为float
- CGAL::Exact_predicates_exact_constructions_kernel--精确谓词,精确构造的内核,通俗的说可以精确的生成几何对象,可以提供精确的计算,换句话说,就是精度最高。
- CGAL::Exact_predicates_inexact_constructions_kernel--精确谓词,不精确的构造内核,简单讲就是生成的几何对象存在舍入误差,就是精度挺高,但在处理的时候精度有所降低。
对比这三种Kernal,核心点就是精度与效率的平衡,精度越高,效率就越低,反之,效率也就越高。但从介绍看,云里雾里,也只能在使用中进行体现了。当然,CGAL中还提供了其余的Kernel,但是目前还没有接触到,所以在本文中不做介绍。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。