OpenMesh学习笔记8 两个基本操作-边的翻转和折叠
2016-06-22 10:41
507 查看
两个基本操作-边的翻转和折叠
原文出处:http://www.openmesh.org/media/Documentations/OpenMesh-Doc-Latest/a00034.html本节介绍OpenMesh中提供的两种基本操作,及对边的翻转和折叠操作。其中翻转操作是针对三角网格的,而折叠操作就是折叠网格中的相邻顶点。
三角网格中的边的翻转
首先考虑两个相邻的三角形,那么它们的公共可以有两种不同的方向。调用函数OpenMesh::TriConnectivity::flip(EdgeHandle _eh)可以将指定的边翻转为另一个方向,图示如下:下面为一段例子代码:
TriMesh mesh; // Add some vertices TriMesh::VertexHandle vhandle[4]; vhandle[0] = mesh.add_vertex(MyMesh::Point(0, 0, 0)); vhandle[1] = mesh.add_vertex(MyMesh::Point(0, 1, 0)); vhandle[2] = mesh.add_vertex(MyMesh::Point(1, 1, 0)); vhandle[3] = mesh.add_vertex(MyMesh::Point(1, 0, 0)); // Add two faces std::vector<TriMesh::VertexHandle> face_vhandles; face_vhandles.push_back(vhandle[2]); face_vhandles.push_back(vhandle[1]); face_vhandles.push_back(vhandle[0]); mesh.add_face(face_vhandles); face_vhandles.clear(); face_vhandles.push_back(vhandle[2]); face_vhandles.push_back(vhandle[0]); face_vhandles.push_back(vhandle[3]); mesh.add_face(face_vhandles); // Now the edge adjacent to the two faces connects // vertex vhandle[0] and vhandle[2]. // Find this edge and then flip it for(TriMesh::EdgeIter it = mesh.edges_begin(); it != mesh.edges_end(); ++it) { if(!mesh.is_boundary(*it)) { // Flip edge mesh.flip(*it); } } // The edge now connects vertex vhandle[1] and vhandle[3].
边的折叠
折叠边主要是让相邻的顶点合并(其实指定的边和其相对的半边都被删除了)。OpenMesh中用于折叠边的函数为OpenMesh::PolyConnectivity::collapse(HalfedgeHandle _heh)。对于指定的半边,半边的起点将被折叠到其终点上(就是起点和半边都被删除了),示例如下图所示,需要注意的是,在折叠边操作之后,有可能会导致网格拓扑的不一致,可以调用函数OpenMesh::PolyConnectivity::is_collapse_ok()进行验证。注意
为了使用折叠和删除操作,需要请求基本元的状态属性(后续介绍)。
查看下面的例子代码:
PolyMesh mesh; // Request required status flags mesh.request_vertex_status(); mesh.request_edge_status(); mesh.request_face_status(); // Add some vertices as in the illustration above PolyMesh::VertexHandle vhandle[7]; vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, 1, 0)); vhandle[1] = mesh.add_vertex(MyMesh::Point(-1, 3, 0)); vhandle[2] = mesh.add_vert 4000 ex(MyMesh::Point(0, 0, 0)); vhandle[3] = mesh.add_vertex(MyMesh::Point(0, 2, 0)); vhandle[4] = mesh.add_vertex(MyMesh::Point(0, 4, 0)); vhandle[5] = mesh.add_vertex(MyMesh::Point(1, 1, 0)); vhandle[6] = mesh.add_vertex(MyMesh::Point(1, 3, 0)); // Add three quad faces std::vector<PolyMesh::VertexHandle> face_vhandles; face_vhandles.push_back(vhandle[1]); face_vhandles.push_back(vhandle[0]); face_vhandles.push_back(vhandle[2]); face_vhandles.push_back(vhandle[3]); mesh.add_face(face_vhandles); face_vhandles.clear(); face_vhandles.push_back(vhandle[1]); face_vhandles.push_back(vhandle[3]); face_vhandles.push_back(vhandle[5]); face_vhandles.push_back(vhandle[4]); mesh.add_face(face_vhandles); face_vhandles.clear(); face_vhandles.push_back(vhandle[3]); face_vhandles.push_back(vhandle[2]); face_vhandles.push_back(vhandle[6]); face_vhandles.push_back(vhandle[5]); mesh.add_face(face_vhandles); // Now find the edge between vertex vhandle[2] // and vhandle[3] for(PolyMesh::HalfedgeIter it = mesh.halfedges_begin(); it != mesh.halfedges_end(); ++it) { if( mesh.to_vertex_handle(*it) == vhandle[3] && mesh.from_vertex_handle(*it) == vhandle[2]) { // Collapse edge mesh.collapse(*it); break; } } // Our mesh now looks like in the illustration above after the collapsing.
相关文章推荐
- 配置openmesh总是出现error LNK2019: 无法解析的外部符号此类问题的解决办法
- OpenMesh学习笔记7 网格文件读写
- OpenMesh学习笔记6 怎样遍历网格
- OpenMesh学习笔记5 OpenMesh+OpenGL的一个例子
- OpenMesh学习笔记2 特点和开发目标
- OpenMesh学习笔记1 安装配置和入门示例
- CGAL【1】实现Hole Filling(补洞)功能
- OpenMesh速记
- VCG文档 - 曲面元素标记位 (Bit Flags on mesh elements)
- Obj文件与Off文件的转换(openmesh)
- 四:深入Nginx之事件和连接 (之二)
- Linux下Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
- linux chkconfig
- Tomcat容器管理安全的几种验证方式
- Linux下程序单例模式的保证机制:/var/run/*.pid
- 1.Linux文件与目录
- Hive体系结构
- Linux使用笔记 (一) 虚拟机运行CentOS7
- linux命令行汇集
- linux 中-ldl和-lpthread 是什么意思?