標籤:
1 INTRODUCTION
在OpenGL中,為了更方便的提供能對合格多邊形進行快速渲染,對合法的多邊形做出條件限制。已知對於空間中的多邊形P的分割是等價於原始多邊形P的一系列互不相交的多邊形的並集。為了最大限度的提高效能,同時解決在三維空間中繪製的凹多邊形在旋轉時發生的閃爍問題。在系統研究學習CGAL三角劃分演算法的基礎上,對演算法的效能進行分析,得出適合本課題的演算法方案。
2 POLYGON PARTITIONING
多邊形劃分有諸多演算法,本文通過函數random_polygon_2產生指定數量下的隨機頂點,對比分析單調劃分(Monotone Partitioning)以及凸劃分(Convex Partitioning)演算法效能,同時輔助以OpenGL環境下的圖形顯示。
template<class OutputIterator , class PointGenerator , class Traits >OutputIterator CGAL::random_polygon_2 ( std::size_t n,OutputIterator result,const PointGenerator & pg,Traits t = Default_traits )
函數通過pg產生n個唯一的隨機頂點,這些頂點以逆時針的順序形成簡單多邊形將結果寫入到result中。
2.1 單調劃分(Monotone Partitioning)
y值單調多邊形(y-monotone polygon)是將頂點v1,v2,...,vn劃分成v1,v2,...,vk和vk,...,vn,v1兩部分。這樣任意水平線至少與其相交一次。為了對給定的多邊形產生y值單調劃分,在函數y_monotone_partition_2()中運用了掃描線演算法。它的時間複雜度為O(nlogn),空間複雜度為O(n)。該演算法產生的多邊形約束數量並不能確保與最優數量保持一致。通過使用is_y_monotone_2()檢測y_monotone_partition_2()函數劃分的有效性。
template<class InputIterator , class OutputIterator , class Traits >OutputIterator CGAL::y_monotone_partition_2 ( InputIterator first,InputIterator beyond,OutputIterator result,const Traits & traits = Default_traits )
前提:由點集[first,beyond)所定義的多邊形為簡單多邊形,且節點按逆時針順序存放。
2.2 凸劃分(Convex Partitioning)
多邊形凸劃分可以利用提供的三個函數來產生。第一個用來產生最優數量。其他兩個用來產生相似最優凸劃分。這兩個函數都是將多邊形分解成簡單的多邊形。
2.2.1 最優凸劃分(optimal convex partition)
最優凸劃分運用了格林的動態規划算法,時間複雜度為 O ( n 4 ) ,空間複雜度為 O ( n 3 )
template<class InputIterator , class OutputIterator , class Traits >OutputIteratorCGAL::optimal_convex_partition_2 ( InputIterator first,InputIterator beyond,OutputIterator result,const Traits & traits=Default_traits)
2.2.2 近似凸劃分( approx convex partition)
函數approx_convex_partition_2()運用了 Hertel 和 Mehlhorn的簡單近似演算法。 對於一個給定的三角,這需要凸分區演算法 O ( n ) 時間和空間複雜度來構建一個最優分解為不超過四次凸塊的數量。
template<class InputIterator , class OutputIterator , class Traits >OutputIterator CGAL::approx_convex_partition_2 ( InputIterator first,InputIterator beyond,OutputIterator result,const Traits & traits = Default_traits )
2.2.3 掃描線近似演算法(sweep-line approximation algorithm)
greene_approx_convex_partition_2()函數需要的時間複雜度為 O ( n log ? n ) 空間複雜度為 O ( n )
template<class InputIterator , class OutputIterator , class Traits >OutputIterator CGAL::greene_approx_convex_partition_2 ( InputIterator first,InputIterator beyond,OutputIterator result,const Traits & traits = Default_traits )
3 CASE STUDY
在程式中通過指定函數CGAL::randompolygon2(50, std::backinserter(polygon),Pointgenerator(500));,產生50個隨機頂點的簡單多邊形。多邊形在各個演算法下的劃分如所示。上述演算法的執行時間如下表所示:
從以上分析結果來看y值單調多邊形的時間效率最高。然而將此演算法運用在旋轉的三維空間時,會發生閃爍的現象。
而通過選擇近似凸劃分演算法則不會發生的情況,且運行效率比其他演算法較高。對代碼效能進行分析,演算法的主要時間在分塊部分。
執行近似凸劃分演算法,選取13個樣本,CPU運行效率如下:
函數詳細資料如所示程式啟動並執行convex_partion_is_valid_2函數最為佔用資源,可以通過改進該函數提高程式效能。
樣本數百分比如所示:
函數百分比詳細資料如所示:
函數調用關係庫如所示:
4 CONCLUSION
在課題中選用的結構面數量較少,一般不超過10個結構面,在對弧線微分後,產生的頂點數一般不超過100,運用近似凸劃分能夠很好的解決三維空間中的幾何平面旋轉時發生的閃爍問題,且該演算法的效能相對其他演算法要高。從該演算法中,可以發現程式所佔用的時間開銷位於函數convex_partion_is_valid_2部分,因此可以進一步分析研究以提升演算法的效率。
5 ACKNOWLEDGMENT
本次實驗主要基於CGAL計算幾何演算法庫,由於本人能力有限,對演算法理解分析難免有疏忽的地方,在此感謝老師對我的耐心指導,煩請批評指正。
6 REFERENCES
[1]Jianyong Li,Jian Xue,Jun Xiao. Three Dimensional Sphere Analysis Method of Block Theory[C]//Computer Application and System Modeling (ICCASM), 2010 International Conference on, 2010: 1-578.
[2]CGAL 4.7 - 2D Polygon Partitioning :http://doc.cgal.org/latest/Partition2/group_PkgPolygonPartitioning2.html
[3]Windows環境下CGAL的安裝:http://www.cnblogs.com/ucas/p/5264609.html
二維平面三角劃分