首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Openmesh中将网格划分为连通的组件

在Openmesh中将网格划分为连通的组件
EN

Stack Overflow用户
提问于 2014-02-01 19:20:19
回答 2查看 3.6K关注 0票数 2

我有一个obj文件网格,我想通过OpenMesh从它中提取连接的组件。我可以找到边界顶点和边,但是在Openmesh中是否有一种直接将网格划分为连通组件的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-02 16:52:24

这个功能不是由OpenMesh提供的(库的目标只是提供一个网格数据结构)。OpenFlipper是一个建立在OpenMesh之上的网格处理库,它是一个更合适的候选库,但也不提供此功能。但是,您可以在MeshTools/MeshInfoT.cc中的代码库中找到一个计算连接组件数量的componentCount函数(它只是对顶点图进行深度优先搜索)。

基于此函数,您应该能够编写代码将网格划分为其连接的组件:

  1. 添加每个顶点的连接组件号属性(例如,初始化为-1,这意味着尚未访问顶点)。
  2. 使用深度优先搜索(或宽度优先搜索.)遍历网格顶点,并为每个顶点设置以下组件号:
    1. 当找到一个未访问的顶点时,增加当前连接的组件数并创建一个新的连接组件。已发现的顶点用作此组件的种子顶点。
    2. 设置从连接组件的种子顶点遍历的所有顶点的组件数。

  1. 一旦遍历完成,就会知道连接组件的总数,并且对于每个顶点,其组件数也是已知的。从这些信息可以建立连通的组件网格(所有属于一个组件的顶点都是已知的,并且可以使用顶点的半边引用来识别这些面)。对于每个连接的组件:
    1. 为这个连接的组件创建一个新的网格。
    2. 从同一个连接组件中添加所有顶点。为连接的组件创建从初始网格中的顶点句柄到新网格中相应顶点句柄的映射。
    3. 查找组件的所有面:要实现这一点,一个简单的方法可以是遍历组件的所有顶点,并对每个顶点迭代它所属的所有面。对于每个新遍历的面,在引用新顶点句柄的新组件网格中创建一个面(使用从旧到新的顶点句柄的映射)。

票数 2
EN

Stack Overflow用户

发布于 2020-02-14 03:21:38

实际上,我用网格的对偶图来解决这个问题。因为如果您直接在原始图上进行图搜索(BFS或DFS等),无论您在每个顶点或每个边上标记连通性,您总是需要处理一些特殊情况,比如两个循环:两个环的大多数顶点是重合的,除了一个顶点不重合外,只留下一个面:黄色和蓝色的环只留下一面。

因此,为了检查网格是否是切片的,我们实际上关注的是face连接。因此,我只需执行双重操作(在Openmesh中对人脸进行迭代,并构建对偶关系) 对偶关系

然后,在对偶图上执行DFS/BFS。每当您将下一个顶点放入挂起的列表中时,请检查该边是否是一个循环上的边的对偶(注意,,边必须在一个循环上,而不是两个循环上的两个顶点,分别为)。最后,只需检查顶点数(如果循环不分割网格,则该数目应与对偶图中的原始顶点数相同)。

您还可以在执行BFS/DFS时添加标签,以标识不同的连接部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21502416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档