fix degenerate faces precondition

This commit is contained in:
Jane Tournois 2020-11-12 15:22:49 +01:00
parent 771da5d1dc
commit c040671a82
1 changed files with 23 additions and 26 deletions

View File

@ -24,7 +24,6 @@
#include <CGAL/Dynamic_property_map.h> #include <CGAL/Dynamic_property_map.h>
#include <CGAL/squared_distance_3.h> #include <CGAL/squared_distance_3.h>
#include <CGAL/Polygon_mesh_processing/measure.h> #include <CGAL/Polygon_mesh_processing/measure.h>
#include <CGAL/Polygon_mesh_processing/shape_predicates.h>
#include <CGAL/number_utils.h> #include <CGAL/number_utils.h>
#ifdef CGAL_EIGEN3_ENABLED #ifdef CGAL_EIGEN3_ENABLED
#include <CGAL/Eigen_solver_traits.h> #include <CGAL/Eigen_solver_traits.h>
@ -52,11 +51,9 @@ struct Intrinsic_Delaunay
{}; {};
namespace internal { namespace internal {
template<typename TriangleMesh>
bool has_degenerate_faces(const TriangleMesh& tm);
template<typename TriangleMesh, typename VertexPointMap> template<typename TriangleMesh, typename Traits>
bool has_degenerate_faces(const TriangleMesh& tm, VertexPointMap vpm); bool has_degenerate_faces(const TriangleMesh& tm, const Traits& traits);
} }
namespace internal { namespace internal {
@ -489,7 +486,7 @@ public:
void estimate_geodesic_distances(VertexDistanceMap vdm) void estimate_geodesic_distances(VertexDistanceMap vdm)
{ {
CGAL_precondition( CGAL_precondition(
!CGAL::Heat_method_3::internal::has_degenerate_faces(triangle_mesh(), vertex_point_map())); !CGAL::Heat_method_3::internal::has_degenerate_faces(triangle_mesh(), Traits()));
if(is_empty(tm)){ if(is_empty(tm)){
return; return;
@ -689,25 +686,32 @@ struct Idt_storage
{} {}
}; };
template<typename TriangleMesh, typename VertexPointMap> template<typename TriangleMesh, typename Traits>
bool has_degenerate_faces(const TriangleMesh& tm, VertexPointMap vpm) bool has_degenerate_faces(const TriangleMesh& tm, const Traits& traits)
{ {
typedef typename Traits::Point_3 Point;
typedef typename Traits::Vector_3 Vector_3;
typename Traits::Construct_vector_3
construct_vector = traits.construct_vector_3_object();
typename Traits::Compute_scalar_product_3
scalar_product = traits.compute_scalar_product_3_object();
typename Traits::Construct_cross_product_vector_3
cross_product = traits.construct_cross_product_vector_3_object();
typename boost::property_map< TriangleMesh, boost::vertex_point_t>::const_type
vpm = get(boost::vertex_point, tm);
for (typename boost::graph_traits<TriangleMesh>::face_descriptor f : faces(tm)) for (typename boost::graph_traits<TriangleMesh>::face_descriptor f : faces(tm))
{ {
if (CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(f, tm, const Point p1 = get(vpm, target(halfedge(f, tm), tm));
CGAL::Polygon_mesh_processing::parameters::vertex_point_map(vpm))) const Point p2 = get(vpm, target(next(halfedge(f, tm), tm), tm));
const Point p3 = get(vpm, target(next(next(halfedge(f, tm), tm), tm), tm));
Vector_3 v = cross_product(construct_vector(p1, p2), construct_vector(p1, p3));
if(scalar_product(v, v) == 0.)
return true; return true;
} }
return false; return false;
} }
template<typename TriangleMesh>
bool has_degenerate_faces(const TriangleMesh& tm)
{
return has_degenerate_faces(tm, get(vertex_point, tm));
}
template <typename TriangleMesh, template <typename TriangleMesh,
typename Traits, typename Traits,
typename LA, typename LA,
@ -748,7 +752,8 @@ struct Base_helper<TriangleMesh, Traits, Intrinsic_Delaunay, LA, VertexPointMap>
void estimate_geodesic_distances(VertexDistanceMap vdm) void estimate_geodesic_distances(VertexDistanceMap vdm)
{ {
CGAL_precondition( CGAL_precondition(
!CGAL::Heat_method_3::internal::has_degenerate_faces(this->m_idt.triangle_mesh())); !CGAL::Heat_method_3::internal::has_degenerate_faces(
this->m_idt.triangle_mesh(), Traits()));
base().estimate_geodesic_distances(this->m_idt.vertex_distance_map(vdm)); base().estimate_geodesic_distances(this->m_idt.vertex_distance_map(vdm));
} }
}; };
@ -967,8 +972,6 @@ estimate_geodesic_distances(const TriangleMesh& tm,
typename boost::graph_traits<TriangleMesh>::vertex_descriptor source, typename boost::graph_traits<TriangleMesh>::vertex_descriptor source,
Mode) Mode)
{ {
CGAL_precondition(!internal::has_degenerate_faces(tm));
CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Mode> hm(tm); CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Mode> hm(tm);
hm.add_source(source); hm.add_source(source);
hm.estimate_geodesic_distances(vdm); hm.estimate_geodesic_distances(vdm);
@ -982,8 +985,6 @@ estimate_geodesic_distances(const TriangleMesh& tm,
VertexDistanceMap vdm, VertexDistanceMap vdm,
typename boost::graph_traits<TriangleMesh>::vertex_descriptor source) typename boost::graph_traits<TriangleMesh>::vertex_descriptor source)
{ {
CGAL_precondition(!internal::has_degenerate_faces(tm));
CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Intrinsic_Delaunay> hm(tm); CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Intrinsic_Delaunay> hm(tm);
hm.add_source(source); hm.add_source(source);
hm.estimate_geodesic_distances(vdm); hm.estimate_geodesic_distances(vdm);
@ -1018,8 +1019,6 @@ estimate_geodesic_distances(const TriangleMesh& tm,
#endif #endif
) )
{ {
CGAL_precondition(!internal::has_degenerate_faces(tm));
CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Mode> hm(tm); CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Mode> hm(tm);
hm.add_sources(sources); hm.add_sources(sources);
hm.estimate_geodesic_distances(vdm); hm.estimate_geodesic_distances(vdm);
@ -1035,8 +1034,6 @@ estimate_geodesic_distances(const TriangleMesh& tm,
typename boost::has_range_const_iterator<VertexConstRange> typename boost::has_range_const_iterator<VertexConstRange>
>::type* = 0) >::type* = 0)
{ {
CGAL_precondition(!internal::has_degenerate_faces(tm));
CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Intrinsic_Delaunay> hm(tm); CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<TriangleMesh, Intrinsic_Delaunay> hm(tm);
hm.add_sources(sources); hm.add_sources(sources);
hm.estimate_geodesic_distances(vdm); hm.estimate_geodesic_distances(vdm);