diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_and_line_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_and_line_policies.h index cd5e5fa75cd..31395b803a2 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_and_line_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_and_line_policies.h @@ -23,6 +23,7 @@ #include #include +#include namespace CGAL { namespace Surface_mesh_simplification { @@ -50,8 +51,9 @@ struct GH_helper{ Vertex_normal_map vertex_normals = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vertex_normal_tag(), tmesh)); - if constexpr(must_compute_vertex_normals) + if constexpr(must_compute_vertex_normals){ Polygon_mesh_processing::compute_vertex_normals(tmesh, vertex_normals, np); + } return vertex_normals; } @@ -64,25 +66,21 @@ struct GH_helper{ FT dm(const NamedParameters& np) const { using parameters::choose_parameter; using parameters::get_parameter; - // choose_parameter(get_parameter(np, internal_np::discontinuity_multiplier), 100); - return FT(100); + return choose_parameter(get_parameter(np, internal_np::discontinuity_multiplier), 100); } }; } -template >::const_type > +template class GarlandHeckbert_plane_and_line_policies : public internal::GarlandHeckbert_composed_policies, - internal::GarlandHeckbert_line_policies, + internal::GarlandHeckbert_line_policies, true> { typedef GarlandHeckbert_plane_policies GH_plane_polices; - typedef internal::GarlandHeckbert_line_policies GH_line_polices; + typedef internal::GarlandHeckbert_line_policies GH_line_polices; typedef internal::GarlandHeckbert_composed_policies - GarlandHeckbert_plane_and_line_policies(TriangleMesh& tmesh, - const FT line_weight, - const FT dm, - const VNM vnm) - : Base(tmesh, GH_plane_polices(tmesh, dm), GH_line_polices(tmesh, dm, vnm), FT(1.)/line_weight, dm) - { } - template GarlandHeckbert_plane_and_line_policies(TriangleMesh& tmesh, const NP& np = parameters::default_values()): Base(tmesh, - GH_plane_polices(tmesh, internal::GH_helper().dm(np)), + GH_plane_polices(tmesh), GH_line_polices(tmesh, internal::GH_helper().vnm(tmesh, np)), FT(1.)/internal::GH_helper().lw(np), FT(1.), diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h index 08589cc4d88..a4429c0be8e 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h @@ -21,6 +21,7 @@ #include #include +#include namespace CGAL { namespace Surface_mesh_simplification { @@ -31,7 +32,7 @@ This policy is not useful on its own; it is designed to be combined with another Therefore, it is kept internal. */ -template +template class Line_quadric_calculator { typedef typename GarlandHeckbert_matrix_types::Mat_4 Mat_4; @@ -42,28 +43,23 @@ class Line_quadric_calculator typedef typename GeomTraits::Vector_3 Vector_3; private: - VertexNormalMap m_vertex_normal_map; + std::function m_vertex_normal_map; public: Line_quadric_calculator() = delete; template Line_quadric_calculator(const VNM vnm) - : m_vertex_normal_map(vnm) + : m_vertex_normal_map([vnm](vertex_descriptor v) -> Vector_3{ return get(vnm, v); }) { } - // Line_quadric_calculator(const TriangleMesh& tmesh):m_vertex_normal_map(tmesh.number_of_vertices()) - // { - // Polygon_mesh_processing::compute_vertex_normals(tmesh, m_vertex_normal_map); - // } - template Mat_4 construct_quadric_from_vertex(typename boost::graph_traits::vertex_descriptor v, const TriangleMesh& /*tmesh*/, const VertexPointMap point_map, const GeomTraits& gt) const { - return construct_line_quadric_from_normal(get(m_vertex_normal_map, v), get(point_map, v), gt); + return construct_line_quadric_from_normal(m_vertex_normal_map(v), get(point_map, v), gt); } template @@ -101,10 +97,10 @@ template >::const_type > class GarlandHeckbert_line_policies : public internal::GarlandHeckbert_cost_and_placement< - internal::Line_quadric_calculator, TriangleMesh, GeomTraits> + internal::Line_quadric_calculator, TriangleMesh, GeomTraits> { public: - typedef internal::Line_quadric_calculator Quadric_calculator; + typedef internal::Line_quadric_calculator Quadric_calculator; private: typedef internal::GarlandHeckbert_cost_and_placement< diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/edge_collapse_garland_heckbert_variations.cpp b/Surface_mesh_simplification/test/Surface_mesh_simplification/edge_collapse_garland_heckbert_variations.cpp index 27befab0b11..9fc5042ae63 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/edge_collapse_garland_heckbert_variations.cpp +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/edge_collapse_garland_heckbert_variations.cpp @@ -91,7 +91,8 @@ get_all_meshes(const std::vector& filenames) template Surface_mesh edge_collapse(Surface_mesh& mesh, - const double ratio = 0.2) + const double ratio, + const Policy p) { typedef typename Policy::Get_cost Cost; typedef typename Policy::Get_placement Placement; @@ -99,8 +100,6 @@ Surface_mesh edge_collapse(Surface_mesh& mesh, std::cout << "Edge collapse mesh of " << num_edges(mesh) << " edges. Policy: " << typeid(Policy).name() << std::endl; - const Policy p ( mesh ); - const Cost& cost = p.get_cost(); const Placement& unbounded_placement = p.get_placement(); Bounded_placement bounded_placement(unbounded_placement); @@ -119,6 +118,12 @@ Surface_mesh edge_collapse(Surface_mesh& mesh, return mesh; } +template +Surface_mesh edge_collapse(Surface_mesh& mesh, + const double ratio = 0.2){ + return edge_collapse(mesh, ratio, Policy(mesh)); +} + // ================================================================================================= // ================================================================================================= // ================================================================================================= @@ -281,6 +286,14 @@ void run(const std::pair& input) gather_face_aspect_ratio(input.first, out); } +template +void test_parameters_plane_and_line(const TriangleMesh& mesh){ + using CGAL::Surface_mesh_simplification::make_GarlandHeckbert_plane_and_line_policies; + TriangleMesh cp = mesh; + edge_collapse(cp, 0.2, make_GarlandHeckbert_plane_and_line_policies(cp, + CGAL::parameters::line_policies_weight(0.001).discontinuity_multiplier(50).geom_traits(Kernel()))); +} + int main(int argc, char** argv) { std::vector default_data = { "data/helmet.off", @@ -295,8 +308,10 @@ int main(int argc, char** argv) data = default_data; std::vector > named_meshes = get_all_meshes(data); - for(const auto& e : named_meshes) + for(const auto& e : named_meshes){ run(e); + test_parameters_plane_and_line(e.first); + } std::cout << "Done!" << std::endl;