OpenMesh學習筆記3 半邊數據結構

半邊數據結構

概述

    本節主要是簡單介紹一下OpenMesh中所使用的用於存儲網格實體,如頂點、邊、面和連接信息的主要數據結構——半邊數據結構(Halfedge Data Structure)。因爲是比較經典的一種存儲多邊形網格數據的數據結構,因此網上資源也很多,絕大部分CG的書上都會有介紹,所以這裏就做一下簡單介紹,也順便梳理下自己的思路,提升對這種數據結構的理解。

半邊結構

    首先,用於存儲網格數據的數據結構有很多,關於它們之間的比較,可以參考文後的參考文獻。

                                    

    上圖就是一個半邊結構表示的網格實例。半邊數據結構的基本元素有頂點,面和半邊(有向邊)。

  • 每一個頂點存儲一個外向半邊(即該點爲半邊的起點);
  • 每一個面存儲一個邊界半邊;
  • 每一個半邊包含以下指針(句柄):
    1,  終點;
    2, 屬於的面;
    3, 所在面的下一條半邊(逆時針方向);
    4, 相反的半邊;
    5, (可選)所在面的上一條半邊。
    經過上述方式存儲的網格結構,可以可以很方便的遍歷出任意一個面的頂點,半邊和相鄰面。當從一個頂點的外向半邊開始遍歷,並迭代到前一個半邊的相反邊。。。通過這個過程,可以很容易列出某一個點的1-ring領域,外向/內向半邊或相鄰曲面。當然這些操作OpenMesh都已經封裝好了(Circulators),後續的筆記中,將陸續展示。
    注意:爲了高效判斷頂點是否爲邊界頂點,所有這些頂點的外向邊,都必須爲邊界半邊(boundary halfedge)。

優點:

    半邊結構的存儲往往比基於面的的結構佔用更多空間,但有着下列重要有點:
  • It is easy to mix faces of arbitrary vertex count in one mesh;
  • 有了點,邊,面的顯示錶示,可以很容易存儲關於點、邊、面的用戶自定義或者OpenMesh預定義的數據在裏面,OpenMesh在設計上提供了這樣的便利,比如我們想在每一個點上加一個權重,只要增加一個權重成員變量即可;
  • 很容易通過循環器得到某一個頂點的1-ring領域,而不需要類似於基於面的結構中的分支判斷語句。


參考文獻:

S. Campagna, L. Kobbelt, H.-P. Seidel, Directed Edges - A Scalable Representation For Triangle Meshes, ACM Journal of Graphics Tools 3 (4), 1998.

Lutz Kettner, Using Generic Programming for Designing a Data Structure for Polyhedral Surfaces, in Proc. 14th Annual ACM Symp. on Computational Geometry, 1998.

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