From 2425bba8a56c60c6d2c1dc76045b0e77db205771 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 4 Jun 2014 16:14:04 +0200 Subject: [PATCH] The OpenMesh example shows at the same time how to wrap the OpenMesh properties --- .../CGAL/boost/graph/Euler_operations.h | 4 +- .../edge_collapse_OpenMesh.cpp | 44 +++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Euler_operations.h b/BGL/include/CGAL/boost/graph/Euler_operations.h index 424e1b51989..d401fa8c406 100644 --- a/BGL/include/CGAL/boost/graph/Euler_operations.h +++ b/BGL/include/CGAL/boost/graph/Euler_operations.h @@ -1004,8 +1004,8 @@ collapse_edge(typename boost::graph_traits::edge_descriptor v0v1, if (!(internal::is_border(edges_to_erase[0],g))) join_face(edges_to_erase[0],g); else - g.erase_facet(edges_to_erase[0]->opposite()); - if (!edges_to_erase[1]->is_border()) + remove_face(opposite(edges_to_erase[0],g),g); + if (!internal::is_border(edges_to_erase[1],g)) join_face(edges_to_erase[1],g); else remove_face(opposite(edges_to_erase[1],g),g); diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_OpenMesh.cpp b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_OpenMesh.cpp index d096fdc400d..c8f0ae07767 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_OpenMesh.cpp +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_OpenMesh.cpp @@ -18,6 +18,37 @@ typedef OpenMesh::PolyMesh_ArrayKernelT Surface_mesh; +typedef boost::graph_traits::edge_descriptor edge_descriptor; +typedef boost::graph_traits::edge_iterator edge_iterator; + +class Constrained_edge_map +{ +public: + typedef boost::read_write_property_map_tag category; + typedef bool value_type; + typedef bool reference; + typedef edge_descriptor key_type; + + Constrained_edge_map(Surface_mesh& sm) + : sm_(sm) + { + sm_.add_property(constraint); + } + + inline friend reference get(const Constrained_edge_map& em, key_type e) + { + return em.sm_.property(em.constraint,em.sm_.edge_handle(e.idx())); + } + + inline friend void put(const Constrained_edge_map& em, key_type e, value_type b) + { + em.sm_.property(em.constraint,em.sm_.edge_handle(e.idx())) = b; + } + +private: + Surface_mesh& sm_; + OpenMesh::EPropHandleT constraint; +}; class OM_vertex_CGAL_point_pmap @@ -61,9 +92,15 @@ namespace SMS = CGAL::Surface_mesh_simplification ; int main( int argc, char** argv ) { Surface_mesh surface_mesh; + Constrained_edge_map constraints_map(surface_mesh); + OpenMesh::IO::read_mesh(surface_mesh, argv[1]); - OpenMesh::IO::read_mesh(surface_mesh, argv[1]); - + // For the pupose of the example we mark 10 edges as constrained edges + edge_iterator b,e; + int count=0; + for(boost::tie(b,e); b!= e; ++b){ + put(constraints_map,*b,(count++ <10)); + } // This is a stop predicate (defines when the algorithm terminates). // In this example, the simplification stops when the number of undirected edges // left in the surface mesh drops below the specified number (1000) @@ -76,7 +113,8 @@ int main( int argc, char** argv ) (surface_mesh ,stop ,CGAL::halfedge_index_map (get(CGAL::halfedge_index ,surface_mesh)) - .vertex_point_map(OM_vertex_CGAL_point_pmap(surface_mesh)) + .vertex_point_map(OM_vertex_CGAL_point_pmap(surface_mesh)) + .edge_is_constrained_map(constraints_map) ); surface_mesh.garbage_collection();