基於CGAL的Centroidal Voronoi Tessellation(CVT)算法實現以及可視化

之前我們已經介紹了基於CGAL的Voronoi圖實現。鏈接:https://blog.csdn.net/aliexken/article/details/106462597

今天我們在該項目的基礎上,來介紹一下Centroidal Voronoi Tessellation(CVT)算法實現及其可視化。

我們知道,Voronoi圖能夠按照原始點所在的位置,將空間劃分成不同的區域。如果該區域被限制在一個有限的域中(如一個正方形),那麼這些劃分的區域全部都是封閉區域。與之對應的,我們能夠將所有的邊求對偶,得到一個三角刨分,如下圖所示:

這種對有限區域的劃分是按照輸入的點的位置進行的,得到的Voronoi面片是不規則的,每個面片的形狀與面積都有較大差距,且對應的三角化也不好(鈍角三角形過多,不滿足空圓條件)。是否可以通過對這些原始點的位置進行優化,來得到一個Voronoi面片更一致,三角化結果更好的結果呢?這就是Centroidal Voronoi Tessellation算法的基本問題。

一個經典的方法是使用Lloyd's Relaxation: https://www.jasondavies.com/lloyd/ (網站有一個直觀的動態圖片,非常好看)。截取兩個圖片來說明結果。

左圖是一個相對初始的狀態,大量的點集中在中心區域,面片的面積由中心向四周呈現擴散的過程。當通過Lloyd迭代計算(800次),可以看到右圖的面片更加趨於一致,包括面積和形狀。

這個過程可以簡單理解爲通過重新計算每一個面片的中點來完成對原始點的更新,所以被稱作"Centroidal" 。維基百科有非常詳盡的解釋:https://en.wikipedia.org/wiki/Lloyd's_algorithm

按照更新的方法,我們對第一開始給出的Voronoi圖進行CVT計算,得到如下結果:

這裏,我們使用一個面片的端點求平均,來更更新原始點,結果發現更新次數超過10次後,就穩定在如上圖的狀態,不在更新。出現這種錯誤的原因是,對於每個面片的端點,其權重是不同的,不能通過單純的求平均來更新,這樣結果就會陷入到一個局部最優。

按照Lloyd's Relaxation的具體更新方法,引入三角面積權重與三角中心加權優化,這樣得到以下結果:

Iteration 10:

Iteration 100:

將區域放大,得到的結果:

Iteration 10:

Iteration 100:

這裏不再給出實現代碼,基於之前Voronoi圖的代碼能夠很方便的實現CVT算法。

參考文獻:

維基百科,https://en.wikipedia.org/wiki/Lloyd's_algorithm#Convergence

Q. Du et al. Centroidal Voronoi Tessellations: Applications and Algorithms, 1999.

D. Yan et al. Isotropic Remeshing with Fast and Exact Computation of Restricted Voronoi Diagram, 2009

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章