zoukankan      html  css  js  c++  java
  • 【OpenMesh】Some basic operations: Flipping and collapsing edges

    这一节中你将学到一些OpenMesh中早已提供的基础操作。
    内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠。

    三角形网格的翻转(Flipping edges)

    考虑到两个邻接面的三角形网格中存在两种不同内部边缘设置。调用函数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.handle())) {
    // Flip edge
    mesh.flip(it.handle());
    }
    }
    // The edge now connects vertex vhandle[1] and vhandle[3].

    边缘折叠(Collapsing edges)

    这一节中你将学到如何进行边缘折叠比如连接两个邻接顶点。OpenMesh提供函数OpenMesh::PolyConnectivity::collapse(HalfedgeHandle _heh)实现这一功能。这会折叠halfedge的起始顶点(halfedge直接指向的方向)到结束顶点,如下图所述。注意边缘折叠会导致网格拓扑不一致。你应该在边缘折叠之后验证一致性,通过调用OpenMesh::PolyConnectivity::is_collapse_ok()。



    简单的代码例子:

    PolyMesh mesh;
    // 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_vertex(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(to_vertex_handle(it.handle()) == vhandle[3] &&
    from_vertex_handle(it.handle()) == vhandle[2]) {
    // Collapse edge
    mesh.collapse(it.handle());
    break;
    }
    }
    // Our mesh now looks like in the illustration above after the collapsing.


  • 相关阅读:
    多播(组播)与广播的技术实现
    (转)单播、多播(组播)和广播的区别
    (转)简述负载均衡&CDN技术
    当领导得学会骂下属的艺术
    CSDN首页> 云计算 孙玄:解析58同城典型技术架构及演变
    VMware网络连接 桥接、NAt、host-only模式 .
    dajian
    [Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?
    Android获取Root权限之后的静默安装实现代码示例分析
    Android
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3194177.html
Copyright © 2011-2022 走看看