2017-08-12 13 views
1

どうやって接続がうまくいくのですか? 私はメッシュから顔を削除し、接続を調整し、不要なエッジや頂点を削除しようとしています。 私はmesh.is_valid()を使用する場合、それは接続の問題壊れH1の前のhalfedgeのCgalサーフェスメッシュ - 接続性

整合性を私に示しています。 v0のハーフエッジは、受信ハーフエッジである ではありません。頂点:反復:number_of_vertices対1(): 5 halfedges:反復:2 number_of_halfedges対():14面:反復:number_of_faces対 3():3

コード:

#include <string> 
#include <CGAL/Simple_cartesian.h> 
#include <CGAL/Surface_mesh.h> 
#include <boost/foreach.hpp> 
#include <iostream> 
#include <CGAL/Simple_cartesian.h> 
#include <CGAL/Gmpq.h> 
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 

typedef CGAL::Surface_mesh<K::Point_3> Mesh; 
typedef Mesh::Vertex_index vertex_descriptor; 
typedef Mesh::Face_index face_descriptor; 
typedef Mesh::Halfedge_index halfedge_descriptor; 
typedef Mesh::Edge_index edge_descriptor; 

int main() 
{ 
    Mesh mesh; 
    vertex_descriptor v0 = mesh.add_vertex(K::Point_3(0,2,0)); 
    vertex_descriptor v1 = mesh.add_vertex(K::Point_3(2,2,0)); 
    vertex_descriptor v2 = mesh.add_vertex(K::Point_3(0,0,0)); 
    vertex_descriptor v3 = mesh.add_vertex(K::Point_3(2,0,0)); 
    vertex_descriptor v4 = mesh.add_vertex(K::Point_3(1,1,0)); 
    mesh.add_face(v3, v1, v4); 
    mesh.add_face(v0, v4, v1); 
    mesh.add_face(v0, v2, v4); 
    mesh.add_face(v2, v3, v4); 

int counter = 0; 
std::vector <edge_descriptor> edg; 
BOOST_FOREACH(face_descriptor fd, mesh.faces()){ 
    if(counter == 0){ 
    halfedge_descriptor hed = mesh.halfedge(fd); 
    halfedge_descriptor prev = mesh.prev(hed); 
    halfedge_descriptor next = mesh.next(hed); 

    mesh.set_vertex_halfedge_to_border_halfedge (next); 
    mesh.set_vertex_halfedge_to_border_halfedge (prev); 
    mesh.set_vertex_halfedge_to_border_halfedge (hed); 

    if(mesh.is_border(mesh.opposite(next))){ 
     mesh.remove_edge(mesh.edge(next)); 
     std::cout << "Remove next halfedge " << next << std::endl; 
    }else{ 
     mesh.set_face(next, mesh.null_face()); 
     std::cout << "sets next halfedge " << next << std::endl; 
    } 

    if(mesh.is_border(mesh.opposite(prev))){ 
     mesh.remove_edge(mesh.edge(prev)); 
     std::cout << "Remove prev halfedge " << prev << std::endl; 
    }else{ 
     mesh.set_face(prev, mesh.null_face()); 
     std::cout << "sets prev halfedge " << prev << std::endl; 
    } 
    if(mesh.is_border(mesh.opposite(hed))){ 
     mesh.remove_edge(mesh.edge(hed)); 
     std::cout << "Remove Face halfedge " << hed << std::endl; 
    }else{ 
     mesh.set_face(hed, mesh.null_face()); 
     std::cout << "sets Face halfedge " << hed << std::endl; 
    } 
    mesh.remove_face(fd); 
    counter++; 

    } 
    } 
    mesh.collect_garbage(); 
    mesh.is_valid(); 
    return 0; 
} 
+0

3つのエッジ操作とそれらの背後にある推論についてそれぞれ簡単に説明できますか? – Alex

+0

最初に、各ハーフエッジを境界ハーフエッジにし、set_vertex_halfedgeをハーフエッジ境界に設定します。その後、反対側のハーフエッジが境界にあるかどうかを確認します。反対側のハーフエッジが境界にある場合は、エッジを削除し、そうでなければ、そのハーフエッジの面をnull_faceに設定します。その後、私はそれをやったとき、私は顔を削除します。 – duufous

答えて

2

Euler operationsremove_face機能を使用してください。それはあなたのために舞台裏で「妥当性を維持する」でしょう。オイラー演算は、MutableFaceGraphのいずれかのタイプGraphの値に作用します。幸いにも、あなたのSurfaceMeshはそのようなモデルです。

次で(あなただけの一面をしたいので、不要である)あなたのループを交換した場合、あなたはそれがどのように動作するか表示されます。

int counter = 0; 
BOOST_FOREACH(face_descriptor fd, mesh.faces()){ 
    counter++; 
} 
std::cout << counter << " faces" << std::endl; 

CGAL::Euler::remove_face(mesh.halfedge(*mesh.faces().begin()), mesh); 
mesh.collect_garbage(); 
mesh.is_valid(); 

counter = 0; 
BOOST_FOREACH(face_descriptor fd, mesh.faces()){ 
    counter++; 
} 
std::cout << counter << " faces" << std::endl; 

これは、検証エラーを生成しませんし、1つ少ないがあることを確認し、操作後にメッシュ内に顔が表示されます。

+0

ありがとう、完全に動作します – duufous

関連する問題