这个头文件实现了一个三维网格分割算法,主要用于将复杂的三角形网格拆分为多个连通的子网格。以下是核心机制的分步解析:
-
邻居索引构建 (
create_face_neighbors_index
)
• 通过顶点-面索引 (VertexFaceIndex
) 快速查找共享同一顶点的所有三角形面
• 对每个三角形的三条边进行并行处理(使用TBB库):
◦ 遍历边的两个顶点关联的所有候选面
◦ 通过顶点顺序匹配确认邻接关系(边AB与边BA互为邻接)
◦ 双向记录邻接信息到neighbors
数组 -
连通区域发现 (
NeighborVisitor
)
• 基于深度优先搜索(DFS)的非递归实现:
◦ 使用栈结构m_facestack
跟踪待访问面
◦ 通过m_visited
位图记录已处理面
◦ 支持中断式遍历(当visitor返回false时终止) -
网格分割核心逻辑 (
its_split
)
• 顶点映射策略:
◦ 使用vidx_conv
数组记录原始顶点在新网格中的映射关系
◦ 每个分割块独立维护顶点集合,避免冗余
• 多阶段处理:
◦ 通过visitor收集连通区域的所有面索引
◦ 为新区域创建顶点和面的深拷贝
◦ 使用输出迭代器模式灵活处理结果存储 -
辅助功能实现
• 可分性判断 (its_is_splittable
):
◦ 通过两次遍历检测是否存在至少两个连通块
• 区块计数 (its_number_of_patches
):
◦ 完全遍历所有连通区域并计数
• 策略适配器 (ItsWithNeighborsIndex_
):
◦ 为不同网格类型提供统一的邻居索引访问接口 -
关键技术亮点
• 并行化处理:在邻居索引构建阶段采用数据并行策略
• 内存优化:使用位图记录访问状态,减少内存占用
• 惰性计算:邻居索引的延迟构建避免不必要的计算
• 泛型设计:通过模板策略支持多种网格数据结构的扩展
典型工作流程示例:
- 输入网格包含两个不相交的立方体
create_face_neighbors_index
为每个面记录三个邻接面,孤立立方体的面邻接为-1its_split
首次遍历发现第一个立方体的所有面,生成子网格- 第二次遍历发现第二个立方体,生成第二个子网格
- 输出迭代器接收两个独立网格数据
潜在优化方向:
• 顶点映射可采用Flyweight模式共享公共顶点
• 大规模网格处理时可引入分块加载机制
• 并行算法可扩展为GPU加速实现
该实现适用于3D打印中的模型修复、有限元分析中的区域划分等需要处理复杂网格结构的应用场景,通过高效的连通区域分析实现快速网格分割。