半边数据结构
本节描述用于存储网格顶点,边,面及其连接信息的基础数据结构。
有许多应用广泛的数据结构用于表示多边形网格。有关它们的详细比较,请参阅本节末尾的参考文章。
本项目中所使用的数目结构为半边数据结构。基于面的数据结构将网格的连接性存储在顶点与其邻接单元上,而基于边的数据结构将网格的连接性存储在边上。假设将这条边在中间一分为二(例如,连接顶点A与B的一条边将会被分成两个有向半边,从A指向B为一个半边,反之亦然),将会获得半边数据结构,下面这张图阐述了半边数据结构存储的连接性。
译者注:下面这张图十分重要!!!
|
a. 指向下一个顶点3; b. 指向一个面4; c. 指向下一边半边5; d. 指向反向的半边6; e. 指向上一个半边7(可选) |
基于这种数据类型的链接,可以方便的实现根据一个面寻找它的顶点、半边或者邻接面。从一个半边的顶点开始迭代至其上一个半边的相反半边,可能轻易的计算出这个顶点,这个顶点进/出半边或者邻接单元。这些功能封装在迭代器中,详情请看网格迭代器与循环器(Mesh Iterators and Circulators)
注意:
- 为了有效地对边界顶点进行分类,这些边界顶点所对应的出半边必须为边界半边,参见OpenMesh::PolyMeshT::is_boundary();
- 无论何时当你使用修改函数更改拓扑关系时,请务必保证此行为,详情参阅OpenMesh::PolyMeshT::adjust_outgoing_halfedge()。
尽管您不需要存储上一个半边(7),因为这可以通过下一个半边的链接性中得出,但为了时间性能,您或许可以选择这么做。实际上,上一个半边在缺省状态下为保存状态(OpenMesh::DefaultTraits),为了获取更多的存储空间您可以使用属性将上一个半边移除。这种使用方式在Specifying your MyMesh中有所陈述。
虽然基于半边的结构通常比基于面的结构消耗更多的内存,但它们具有以下重要优点:
- 在一个网格中加入面或顶点十分容易;
- 可以明确的表示面、边和顶点,由于这种结构能够轻易的实现这些类型的成员变量模块化,用来存储每条边/半边的数据将会非常有用;
- 通过一个顶点计算其邻接面、边对于多边形的各种几何计算非常重要。基于面的数据结构将会导致许多类似if-then的分支,半边数据结构能够在常数时间内提供这种功能且不需要条件分支。
参考文献
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.
译者说明:因科研需要,避免重复造轮子,近来借用OpenMesh,因其结构封装严谨,灵活可靠,且十分方便,故抽出时间对官网的说明做点翻译。英文水平不高,如翻译有误请多多包涵,也请您多多指正。
上一篇:使用并理解OpenMesh-OpenMesh的功能和目标
下一篇:使用并理解OpenMesh-迭代器与循环器
英文原文地址:http://www.openmesh.org/Documentation/OpenMesh-Doc-Latest/index.html
---------------------
作者:feengg
来源:优快云
原文:https://blog.youkuaiyun.com/feengg/article/details/85983372
版权声明:本文为博主原创文章,转载请附上博文链接!