From dd19b506ed8b4c38953dc5b6d784138e442256e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sat, 3 Apr 2021 11:14:15 +0200 Subject: [PATCH] first version to add epsilon per face --- .../CGAL/boost/graph/parameters_interface.h | 1 + .../include/CGAL/Polyhedral_envelope.h | 62 ++++++++++++++++--- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/parameters_interface.h b/BGL/include/CGAL/boost/graph/parameters_interface.h index eebd236eaca..1ce1ce3900f 100644 --- a/BGL/include/CGAL/boost/graph/parameters_interface.h +++ b/BGL/include/CGAL/boost/graph/parameters_interface.h @@ -120,6 +120,7 @@ CGAL_add_named_parameter(do_not_modify_t, do_not_modify, do_not_modify) CGAL_add_named_parameter(allow_self_intersections_t, allow_self_intersections, allow_self_intersections) CGAL_add_named_parameter(non_manifold_feature_map_t, non_manifold_feature_map, non_manifold_feature_map) CGAL_add_named_parameter(polyhedral_envelope_epsilon_t, polyhedral_envelope_epsilon, polyhedral_envelope_epsilon) +CGAL_add_named_parameter(face_epsilon_map_t, face_epsilon_map, face_epsilon_map) // List of named parameters that we use in the package 'Surface Mesh Simplification' CGAL_add_named_parameter(get_cost_policy_t, get_cost_policy, get_cost) diff --git a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h index b1d76c12950..16b3e554e76 100644 --- a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h +++ b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h @@ -333,8 +333,10 @@ public: { using parameters::choose_parameter; using parameters::get_parameter; + using parameters::is_default_parameter; typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::face_descriptor face_descriptor; typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -353,7 +355,7 @@ public: } GeomTraits gt; - for(typename Graph_traits::face_descriptor f : faces(tmesh)){ + for(face_descriptor f : faces(tmesh)){ if(! Polygon_mesh_processing::is_degenerate_triangle_face(f, tmesh, parameters::geom_traits(gt).vertex_point_map(vpm))){ typename Graph_traits::halfedge_descriptor h = halfedge(f, tmesh); int i = get(vim, source(h, tmesh)); @@ -364,7 +366,26 @@ public: env_faces.push_back(face); } } - init(epsilon); + if (is_default_parameter(get_parameter(np, internal_np::face_epsilon_map))) + init(std::vector(env_faces.size(), epsilon)); + else + { + std::vector epsilon_values; + epsilon_values.reserve(env_faces.size()); + + typedef typename internal_np::Lookup_named_param_def< + internal_np::face_epsilon_map_t, + NamedParameters, + Constant_property_map + > ::type Epsilon_map; + + Epsilon_map epsilon_map = choose_parameter(get_parameter(np, internal_np::face_epsilon_map), + Constant_property_map(epsilon)); + + for(face_descriptor f : faces(tmesh)) + if(! Polygon_mesh_processing::is_degenerate_triangle_face(f, tmesh, parameters::geom_traits(gt).vertex_point_map(vpm))) + epsilon_values.push_back( get(epsilon_map, f) ); + } } /** @@ -407,6 +428,7 @@ public: { using parameters::choose_parameter; using parameters::get_parameter; + using parameters::is_default_parameter; typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -442,7 +464,27 @@ public: env_faces.push_back(face); } } - init(epsilon); + + if (is_default_parameter(get_parameter(np, internal_np::face_epsilon_map))) + init(std::vector(env_faces.size(), epsilon)); + else + { + std::vector epsilon_values; + epsilon_values.reserve(env_faces.size()); + + typedef typename internal_np::Lookup_named_param_def< + internal_np::face_epsilon_map_t, + NamedParameters, + Constant_property_map + > ::type Epsilon_map; + + Epsilon_map epsilon_map = choose_parameter(get_parameter(np, internal_np::face_epsilon_map), + Constant_property_map(epsilon)); + + for(face_descriptor f : face_range) + if(! Polygon_mesh_processing::is_degenerate_triangle_face(f, tmesh, parameters::geom_traits(gt).vertex_point_map(vpm))) + epsilon_values.push_back( get(epsilon_map, f) ); + } } /** @@ -499,7 +541,7 @@ public: Vector3i face = { int(t[0]), int(t[1]), int(t[2]) }; env_faces.emplace_back(face); } - init(epsilon); + init(std::vector(env_faces.size(), epsilon)); } /// @} @@ -530,9 +572,9 @@ public: private: - void init(double epsilon) + void init(const std::vector& epsilon_values) { - halfspace_generation(env_vertices, env_faces, halfspace, bounding_boxes, epsilon); + halfspace_generation(env_vertices, env_faces, halfspace, bounding_boxes, epsilon_values); Datum_map datum_map(bounding_boxes); Point_map point_map(bounding_boxes); @@ -1775,10 +1817,8 @@ private: void halfspace_generation(const std::vector &ver, const std::vector &faces, std::vector& halfspace, - std::vector& bounding_boxes, const double epsilon) + std::vector& bounding_boxes, const std::vector& epsilon_values) { - double tolerance = epsilon / std::sqrt(3);// the envelope thickness, to be conservative - double bbox_tolerance = epsilon *(1 + 1e-6); Vector_3 AB, AC, BC, normal; Plane plane; std::array box; @@ -1804,6 +1844,10 @@ private: bounding_boxes.resize(faces.size()); for (unsigned int i = 0; i < faces.size(); ++i) { + const double epsilon = epsilon_values[i]; + double tolerance = epsilon / std::sqrt(3);// the envelope thickness, to be conservative + double bbox_tolerance = epsilon *(1 + 1e-6); + Bbox bb = ver[faces[i][0]].bbox () + ver[faces[i][1]].bbox() + ver[faces[i][2]].bbox(); // todo: Add a grow() function to Bbox bounding_boxes[i] = Iso_cuboid_3(Point_3(bb.xmin()-bbox_tolerance, bb.ymin()-bbox_tolerance, bb.zmin()-bbox_tolerance),