diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_policies.h index 8fbc2cba3fc..2d77132ec59 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_policies.h @@ -32,6 +32,15 @@ class Plane_quadric_calculator public: Plane_quadric_calculator() { } + 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 Mat_4::Zero(); + } + template Mat_4 construct_quadric_from_edge(typename boost::graph_traits::halfedge_descriptor he, const TriangleMesh& tmesh, diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_plane_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_plane_policies.h index e533b381ded..f1f2b102c90 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_plane_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_plane_policies.h @@ -74,6 +74,15 @@ public: } public: + 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 Mat_4::Zero(); + } + template Mat_4 construct_quadric_from_edge(const halfedge_descriptor he, const TriangleMesh& tmesh, diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_triangle_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_triangle_policies.h index d8ef45f13f0..c08d66c5642 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_triangle_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_triangle_policies.h @@ -48,7 +48,7 @@ private: // this is only used when we fall back to probabilistic planes for the discontinuous edges, // the actual triangle quadric calculation only uses the normal variance - static constexpr FT position_variance_factor = 1; + static constexpr FT position_variance_factor = 0.1; Face_variance_map m_face_variance_map; @@ -74,6 +74,15 @@ public: } public: + 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 Mat_4::Zero(); + } + // we don't have a sensible way to construct a triangle quadric // from an edge, so we fall back to probabilistic plane quadrics here template diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_triangle_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_triangle_policies.h index 1e8b2eaee10..1f340e233ea 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_triangle_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_triangle_policies.h @@ -32,6 +32,15 @@ class Triangle_quadric_calculator public: Triangle_quadric_calculator() { } + 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 Mat_4::Zero(); + } + template Mat_4 construct_quadric_from_edge(typename boost::graph_traits::halfedge_descriptor he, const TriangleMesh& tmesh, diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_functions.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_functions.h index 6d954dd8b65..135d2c2e531 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_functions.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_functions.h @@ -14,6 +14,8 @@ #include +#include + #include #include @@ -508,6 +510,77 @@ construct_prob_triangle_quadric_from_face(typename boost::graph_traits +typename GarlandHeckbert_matrix_types::Mat_4 +construct_line_quadric_from_normal(const typename GeomTraits::Vector_3& normal, + const typename GeomTraits::Point_3& point, + const GeomTraits& gt) +{ + typedef typename GeomTraits::FT FT; + typedef typename GeomTraits::Vector_3 Vector_3; + + typedef typename GarlandHeckbert_matrix_types::Row_4 Row_4; + + auto cp = gt.construct_cross_product_vector_3_object(); + auto plane = gt.construct_plane_3_object(); + auto c_point = gt.construct_point_3_object(); + auto base= gt.construct_base_vector_3_object(); + + Vector_3 x=base(plane(c_point(0,0,0),normal), 1); + CGAL::Polygon_mesh_processing::internal::normalize(x, gt); + Vector_3 y=cp(x,normal); + + return construct_classic_plane_quadric_from_normal(x, point, gt)+construct_classic_plane_quadric_from_normal(y, point, gt); +} + +template +typename GarlandHeckbert_matrix_types::Mat_4 +construct_line_quadric_from_vertex(const typename boost::graph_traits::vertex_descriptor v, + const TriangleMesh& mesh, + const VertexPointMap vpm, + const GeomTraits& gt) +{ + typedef typename GeomTraits::Vector_3 Vector_3; + + const Vector_3 normal = Polygon_mesh_processing::compute_vertex_normal(v, mesh, parameters::geom_traits(gt).vertex_point_map(vpm)); + return construct_line_quadric_from_normal(normal, get(vpm, v), gt); +} + +// template +// typename GarlandHeckbert_matrix_types::Mat_4 +// construct_classic_line_quadric_from_edge(typename boost::graph_traits::halfedge_descriptor he, +// const TriangleMesh& mesh, +// const VertexPointMap vpm, +// const GeomTraits& gt) +// { +// typedef typename GeomTraits::Vector_3 Vector_3; + +// const Vector_3 normal = construct_edge_normal(he, mesh, vpm, gt); + +// // use this normal to construct the quadric analogously to constructing quadric +// // from the normal of the face +// return construct_classic_line_quadric_from_normal(normal, get(vpm, target(he, mesh)), gt); +// } + +// template +// typename GarlandHeckbert_matrix_types::Mat_4 +// construct_classic_line_quadric_from_face(typename boost::graph_traits::face_descriptor f, +// const TriangleMesh& mesh, +// const VertexPointMap vpm, +// const GeomTraits& gt) +// { +// auto normal = construct_unit_normal_from_face(f, mesh, vpm, gt); + +// // get any point of the face +// const auto p = get(vpm, target(halfedge(f, mesh), mesh)); + +// return construct_classic_line_quadric_from_normal(normal, p, gt); +// } + //////////////////////////////////////////////////////////////////////////////////////////////////// /// PROB VARIANCE //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h index 590747a252b..2f8d6cfbc78 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h @@ -129,6 +129,15 @@ public: } public: + template + Mat_4 construct_quadric(const vertex_descriptor v, + const TriangleMesh& tmesh, + const VertexPointMap vpm, + const GeomTraits& gt) const + { + return quadric_calculator().construct_quadric_from_vertex(v, tmesh, vpm, gt); + } + template Mat_4 construct_quadric(const halfedge_descriptor he, const TriangleMesh& tmesh, @@ -157,7 +166,7 @@ public: Mat_4 zero_mat = Mat_4::Zero(); for(vertex_descriptor v : vertices(tmesh)) - put(vcm(), v, zero_mat); + put(vcm(), v, construct_quadric(v, tmesh, vpm, gt)); for(face_descriptor f : faces(tmesh)) {