2017-07-29 14 views
0

yの長さでメッシュの一部を削除するスライス機能を作っています。問題は、メッシュの削除されたフェースエッジを削除しようとすると、無限ループに入ります。サーフェスメッシュ除去エッジ、ループが無限ループに入ります。CGAL

ここで問題が発生します。

//removes edge - puts in infinite loop 
BOOST_FOREACH(halfEdge_descriptor hed, halfedges_around_face(mesh.halfedge(fd), mesh)){ 
edge_descriptor ed = mesh.edge(hed); 
mesh.remove_edge(ed); 
} 

iはhalfedges、繰り返し処理は、反復が必要として、私は

remove_edge(Edge_index編)

に変換することによって、halfedgeを削除しようそれは無限ループに入ります。

誰もがなぜそうするのか説明できますが、どうすれば修正できますか?

フルコード!あなたが反復されている要素を削除:

void Mesh::slice(SurfaceMesh &mesh, double lengthToCut){ 
    typedef SurfaceMesh::Vertex_index vertex_descriptor; 
    typedef SurfaceMesh::Face_index face_descriptor; 
    typedef SurfaceMesh::Halfedge_index halfEdge_descriptor; 
    typedef SurfaceMesh::Edge_index edge_descriptor; 
    double y = findMaxY(mesh) - lengthToCut; // length of a mesh 
    //;oops over faces 
    BOOST_FOREACH(face_descriptor fd, mesh.faces()){ 
    int verticesLargerThan = 0; 
    //loops over vertices of face 
    BOOST_FOREACH(vertex_descriptor vd,vertices_around_face(mesh.halfedge(fd), mesh)){ 
     if(CGAL::compare (mesh.point(vd)[1], y) == CGAL::LARGER){ 
     verticesLargerThan++; 
     // if all vertices y coordinates are larger than double y, then removes face 
     if(verticesLargerThan == 3){ 
      mesh.remove_face(fd); 
      //mesh.remove_face(fd); 
      int removedFaceCounter = 0; 
      BOOST_FOREACH(face_descriptor rfd,faces_around_face(mesh.halfedge(fd), mesh)){ 
      if(mesh.is_removed(rfd)){ 
       removedFaceCounter++; 
      } 
      //remove all edges and vertices of face if face is not linked to any other face 
      if(removedFaceCounter == 3){ 
       //removes edge - puts in infinite loop 
       BOOST_FOREACH(halfEdge_descriptor hed, halfedges_around_face(mesh.halfedge(fd), mesh)){ 
       edge_descriptor ed = mesh.edge(hed); 
       mesh.remove_edge(ed); 
       } 
       //removes vertice 
       BOOST_FOREACH(vertex_descriptor rvd,vertices_around_face(mesh.halfedge(fd), mesh)){ 
       //removes vertice if its not linked to any face 
       bool allFacesRemoved = true; 
       BOOST_FOREACH(face_descriptor rfvd, faces_around_target(mesh.halfedge(fd), mesh)){ 

        if(!mesh.is_removed(rfvd)){ 
        allFacesRemoved = false; 
        break; 
        } 
       } 
       if(allFacesRemoved){ 
        mesh.remove_vertex(rvd); 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 

答えて

1

これは、古典的な間違いがあります。この特定のケースでは、面のエッジを反復しながらエッジを削除しています。反復を止めるために最初のエッジ、つまり無限ループを見つけることはほとんどありません。

+0

すでに見つかっている、愚かな私の笑 – duufous

関連する問題