网状迭代器和循环器

迭代器

  • 网格提供线性迭代器(枚举顶点,半边,边和面)。 这些可用于轻松浏览网格。 每个迭代器XYZIter也存在于const版本的ConstXYZIter中。
  • 所有迭代器都在命名空间OpenMesh :: Iterators中定义。 它们是模板类,期望完全指定网格作为模板参数。 您应该使用网格本身提供的迭代器类型,即MyMesh :: VertexIter而不是OpenMesh :: Iterators :: VertexIterT <MyMesh>。
  • 具体的示例如下所示:
  • 虽然可以使用handle()来获取迭代器引用的项的句柄,但不推荐使用此函数。 只需取消引用迭代器即可。

删除元素

  • 如果没有网格元素被标记为已删除,则idx()提供的索引是从0到元素数1的连续数字
  • 当元素标记为已删除且尚未调用OpenMesh :: ArrayKernel :: garbage_collection()时,情况并非如此。
  • 在调用了garbage_collection()之后,重新组织了元素,并且它们的句柄和迭代器再次保证是连续的数字。
  • OpenMesh使用延迟删除方案来避免对数据结构进行不必要的更新。 halfedge数据结构将始终直接更新,以确保以下算法具有正确的迭代器设置。
  • 因此,如果删除一个面,面部本身仍将存在,但现在位于孔处的半边将直接更新,这意味着相邻顶点上的循环器将不再出现在面上。
  • 如果删除边缘,则也会删除相邻的面(标记它们被删除并更新周围的半边)。 边缘本身也将被标记为已删除。 循环器再也不会看到已删除的原语。
  • 对于顶点,使用上面的方案删除所有相邻的面和边,并将顶点标记为已删除。
  • 穿过顶点边和面的迭代器仍将枚举所有基元(包括已删除的基元)。 除非您使用跳过迭代器,否则将跳过已删除的基元。 循环器总是只枚举未删除的原语。

如何在OpenMesh中使用迭代器示例

跳跃迭代器

  • 所有迭代器也可用作跳过迭代器。 如果在网格上删除元素,则标准迭代器将遍历所有元素,甚至是已删除的元素(在完成garbage_collection之前可用)。 跳过迭代器会忽略这些元素。 可以通过调用以下函数之一来检索跳过迭代器:

循环器

  • OpenMesh还提供所谓的循环器,其提供与枚举相同或另一种类型的另一项相邻的项的方法。
  • 通常,CenterItem_AuxiliaryInformation_TargetItem_Iter指定循环器,该循环器枚举给定中心项周围的所有目标项。
  • 循环器的构造器具有循环器(MeshType mesh,TargetHandle center_handle)的形式,即它采用网格和物品的手柄来循环。
  • 常用循环器举例:
  • 虽然可以使用操作符bool(),它返回true,只要循环器没有到达序列的末尾,就不推荐使用此函数。 请改用函数is_valid()。
  • OpenMesh提供以下功能(在OpenMesh :: PolyConnectivity中定义)以获取指定中心项周围的循环器:
  • 除了普通的循环器之外,每个方向都存在一些(顺时针方向,逆时针方向)。 那些循环器可能比正常循环器慢,但循环方向是有保证的。
  • 可以将cw循环器转换为ccw循环器,反之亦然。 为此,每个循环器提供一个构造函数,将另一个循环器作为输入。 如果转换了一个cw循环器,则ccw循环器指向与指向的cw循环器相同的元件,但增量和减量的方向改变。
  • 从迭代器构造循环器时,请确保不要创建已删除元素的循环器(例如,已删除的Face的FaceVertexiter),因为这将导致不可预测的行为。 使用跳过迭代器迭代元素并从中创建循环器是安全的,因为它们不包含已删除的元素。

如何在OpenMesh中使用循环器

  • 下面的代码示例现在演示如何枚举每个顶点的1环:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值