mirror of https://github.com/CGAL/cgal
in case an edge is both a cap and a needle but that is not collapsable try to flip
This commit is contained in:
parent
6cb87048bd
commit
c9c1770c18
|
|
@ -69,6 +69,8 @@ is_badly_shaped(const typename boost::graph_traits<TriangleMesh>::face_descripto
|
||||||
|
|
||||||
const halfedge_descriptor null_h = boost::graph_traits<TriangleMesh>::null_halfedge();
|
const halfedge_descriptor null_h = boost::graph_traits<TriangleMesh>::null_halfedge();
|
||||||
|
|
||||||
|
std::array<halfedge_descriptor,2> retval = make_array(null_h, null_h);
|
||||||
|
|
||||||
halfedge_descriptor res = PMP::is_needle_triangle_face(f, tmesh, needle_threshold,
|
halfedge_descriptor res = PMP::is_needle_triangle_face(f, tmesh, needle_threshold,
|
||||||
parameters::vertex_point_map(vpm)
|
parameters::vertex_point_map(vpm)
|
||||||
.geom_traits(gt));
|
.geom_traits(gt));
|
||||||
|
|
@ -78,7 +80,7 @@ is_badly_shaped(const typename boost::graph_traits<TriangleMesh>::face_descripto
|
||||||
if(collapse_length_threshold == 0 ||
|
if(collapse_length_threshold == 0 ||
|
||||||
edge_length(res, tmesh, parameters::vertex_point_map(vpm).geom_traits(gt)) <= collapse_length_threshold)
|
edge_length(res, tmesh, parameters::vertex_point_map(vpm).geom_traits(gt)) <= collapse_length_threshold)
|
||||||
{
|
{
|
||||||
return make_array(res, null_h);
|
retval[0]=res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,10 +91,10 @@ is_badly_shaped(const typename boost::graph_traits<TriangleMesh>::face_descripto
|
||||||
typename Traits::Line_3(get(vpm, source(res,tmesh)), get(vpm, target(res,tmesh))),
|
typename Traits::Line_3(get(vpm, source(res,tmesh)), get(vpm, target(res,tmesh))),
|
||||||
flip_triangle_height_threshold_squared) != LARGER ))
|
flip_triangle_height_threshold_squared) != LARGER ))
|
||||||
{
|
{
|
||||||
return make_array(null_h, res);
|
retval[1]=res;
|
||||||
}
|
}
|
||||||
|
|
||||||
return make_array(null_h, null_h);
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TriangleMesh, typename HalfedgeContainer,
|
template <typename TriangleMesh, typename HalfedgeContainer,
|
||||||
|
|
@ -119,7 +121,10 @@ void collect_badly_shaped_triangles(const typename boost::graph_traits<TriangleM
|
||||||
if(res[0] != boost::graph_traits<TriangleMesh>::null_halfedge())
|
if(res[0] != boost::graph_traits<TriangleMesh>::null_halfedge())
|
||||||
{
|
{
|
||||||
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
||||||
std::cout << "add new needle: " << edge(res[0], tmesh) << std::endl;
|
if (res[1] == boost::graph_traits<TriangleMesh>::null_halfedge())
|
||||||
|
std::cout << "add new needle: " << edge(res[0], tmesh) << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "add new needle (also a cap): " << edge(res[0], tmesh) << std::endl;
|
||||||
#endif
|
#endif
|
||||||
CGAL_assertion(!is_border(res[0], tmesh));
|
CGAL_assertion(!is_border(res[0], tmesh));
|
||||||
CGAL_assertion(!get(ecm, edge(res[0], tmesh)));
|
CGAL_assertion(!get(ecm, edge(res[0], tmesh)));
|
||||||
|
|
@ -738,13 +743,13 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range,
|
||||||
<< " (" << source(e, tmesh) << " " << tmesh.point(source(h, tmesh))
|
<< " (" << source(e, tmesh) << " " << tmesh.point(source(h, tmesh))
|
||||||
<< " --- " << source(e, tmesh) << " " << tmesh.point(target(h, tmesh)) << ")" << std::endl;
|
<< " --- " << source(e, tmesh) << " " << tmesh.point(target(h, tmesh)) << ")" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Verify that the element is still badly shaped
|
||||||
|
const std::array<halfedge_descriptor, 2> nc =
|
||||||
|
internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, vcm, ecm, gt,
|
||||||
|
cap_threshold, needle_threshold, collapse_length_threshold, flip_triangle_height_threshold_squared);
|
||||||
if(CGAL::Euler::does_satisfy_link_condition(e, tmesh))
|
if(CGAL::Euler::does_satisfy_link_condition(e, tmesh))
|
||||||
{
|
{
|
||||||
// Verify that the element is still badly shaped
|
|
||||||
const std::array<halfedge_descriptor, 2> nc =
|
|
||||||
internal::is_badly_shaped(face(h, tmesh), tmesh, vpm, vcm, ecm, gt,
|
|
||||||
cap_threshold, needle_threshold, collapse_length_threshold, flip_triangle_height_threshold_squared);
|
|
||||||
|
|
||||||
if(nc[0] != h)
|
if(nc[0] != h)
|
||||||
{
|
{
|
||||||
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
||||||
|
|
@ -862,7 +867,15 @@ bool remove_almost_degenerate_faces(const FaceRange& face_range,
|
||||||
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
||||||
std::cout << "\t Uncollapsable edge!" << std::endl;
|
std::cout << "\t Uncollapsable edge!" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
next_edges_to_collapse.insert(h);
|
if (nc[1]==boost::graph_traits<TriangleMesh>::null_halfedge())
|
||||||
|
next_edges_to_collapse.insert(h);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef CGAL_PMP_DEBUG_REMOVE_DEGENERACIES_EXTRA
|
||||||
|
std::cout << "\t Uncollapsable edge --> register it as cap!" << std::endl;
|
||||||
|
#endif
|
||||||
|
edges_to_flip.insert(nc[1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue