半边数据结构

该项目中使用的数据结构是所谓的半边数据结构。 虽然基于面的结构将其连接存储在引用其顶点和邻居的面中,但基于边缘的结构将连接信息放入边缘。 每条边引用其两个顶点,即它所属的面和这些面中的两个下一条边。 如果现在分割边缘(即,连接顶点A和顶点B的边缘变为从A到B的两个定向halfeges,反之亦然),则获得基于半边缘的数据结构。 下图说明了此结构中存储连接的方式:

在项目之间具有这些链接,现在可以围绕一个面进行循环,以便枚举其所有顶点,边界或相邻面。 当从顶点的半边开始并迭代到其前一个的相反时,可以很容易地在该顶点周围循环并获得其所有单环邻居,输入/输出半边或相邻面。 所有这些功能都封装在所谓的循环器中,如Mesh Iterators和Circulators中所述。

为了有效地对边界顶点进行分类,这些顶点的出局半边必须是边界半边。无论何时使用低级拓扑更改功能修改拓扑,请务必保证此行为。

虽然不需要明确地存储前一个半边(7),因为它可以从到下一个halfedges的链接导出,但为了性能,可以这样做。 实际上,默认存储前一个半边(OpenMesh :: DefaultTraits)。 使用特征和属性可以删除前一个半边,以获得记忆。 

虽然基于半边的结构通常比基于面部的对应部件消耗更多的内存,但它们具有以下重要优点:

  • 在一个网格中很容易混合任意顶点数的面。
  • 我们现在有一个顶点,面和边/半边的明确表示。 如果必须每边/半边存储数据,这将非常有用,因为这可以通过这些类型的成员变量轻松建模。
  • 围绕顶点循环以获得其单环邻域是多边形网格上的多种算法的重要操作。 对于基于面的结构,这导致许多if-then分支,半边结构在恒定时间内提供这种功能而没有条件分支。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值