【CGAL學習筆記】--Kernel介紹

  本人接觸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,可是目前尚未接觸到,因此在本文中不作介紹。code

相關文章
相關標籤/搜索