29 #ifndef EMODNET_QMGC_CGAL_FURTHER_CONSTRAINED_PLACEMENT_H 30 #define EMODNET_QMGC_CGAL_FURTHER_CONSTRAINED_PLACEMENT_H 32 #include <CGAL/Surface_mesh_simplification/Detail/Common.h> 33 #include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile.h> 40 namespace Surface_mesh_simplification {
48 template<
class BasePlacement,
class EdgeIsConstrainedMap,
class VertexIsConstrainedMap>
52 EdgeIsConstrainedMap Edge_is_constrained_map;
53 VertexIsConstrainedMap Vertex_is_constrained_map;
57 EdgeIsConstrainedMap edgesMap = EdgeIsConstrainedMap(),
58 VertexIsConstrainedMap vertMap = VertexIsConstrainedMap(),
59 BasePlacement base = BasePlacement())
60 : BasePlacement(base), Edge_is_constrained_map(edgesMap), Vertex_is_constrained_map(vertMap) {}
62 template<
typename Profile>
63 optional<typename Profile::Point> operator()(Profile
const &aProfile)
const {
64 typedef typename Profile::ECM ECM;
65 typedef typename CGAL::Halfedge_around_target_iterator<ECM> in_edge_iterator;
68 bool isConstrainedV0 =
get(Vertex_is_constrained_map, aProfile.v0()) ;
69 bool isConstrainedV1 =
get(Vertex_is_constrained_map, aProfile.v1()) ;
71 if ( isConstrainedV0 && isConstrainedV1 ) {
73 return boost::optional<typename Profile::Point>();
75 else if ( isConstrainedV0 ) {
77 typename Profile::Point p =
get(aProfile.vertex_point_map(), aProfile.v0()) ;
78 return get(aProfile.vertex_point_map(), aProfile.v0()) ;
80 else if ( isConstrainedV1 ) {
82 typename Profile::Point p =
get(aProfile.vertex_point_map(), aProfile.v1()) ;
83 return get(aProfile.vertex_point_map(), aProfile.v1()) ;
87 in_edge_iterator eb, ee;
88 for (boost::tie(eb, ee) = halfedges_around_target(aProfile.v0(), aProfile.surface_mesh());
90 if (
get(Edge_is_constrained_map, edge(*eb, aProfile.surface_mesh())))
91 return get(aProfile.vertex_point_map(),
94 for (boost::tie(eb, ee) = halfedges_around_target(aProfile.v1(), aProfile.surface_mesh());
96 if (
get(Edge_is_constrained_map, edge(*eb, aProfile.surface_mesh())))
97 return get(aProfile.vertex_point_map(),
101 return static_cast<const BasePlacement *
>(
this)->
operator()(aProfile);
107 #endif //EMODNET_QMGC_CGAL_FURTHER_CONSTRAINED_PLACEMENT_H Constrained placement class for CGAL::Surface_mesh_simplification, extending the normal constrained p...
Definition: further_constrained_placement.h:49
Extension of CGAL's Constrained_placement class.
Definition: further_constrained_placement.h:38