本人接觸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:函數
對比這三種Kernal,核心點就是精度與效率的平衡,精度越高,效率就越低,反之,效率也就越高。但從介紹看,雲裏霧裏,也只能在使用中進行體現了。固然,CGAL中還提供了其他的Kernel,可是目前尚未接觸到,因此在本文中不作介紹。code