Allow removing degree 2 vertices incident to a triangle face

This commit is contained in:
Mael Rouxel-Labbé 2024-12-13 22:18:13 +01:00
parent 9e5dcbf548
commit 2db11f6a2c
1 changed files with 25 additions and 16 deletions

View File

@ -1869,7 +1869,6 @@ bool satisfies_link_condition(typename boost::graph_traits<Graph>::edge_descript
/// removes the target vertex of `h`, merging its incident edges into a single edge. /// removes the target vertex of `h`, merging its incident edges into a single edge.
/// \pre `degree(target(h, g), g) == 2`. /// \pre `degree(target(h, g), g) == 2`.
/// \pre there is no pre-existing edge between source(h, g) and target(next(h, g), g)
template <typename Graph> template <typename Graph>
typename boost::graph_traits<Graph>::halfedge_descriptor typename boost::graph_traits<Graph>::halfedge_descriptor
remove_degree_2_vertex(const typename boost::graph_traits<Graph>::halfedge_descriptor h, remove_degree_2_vertex(const typename boost::graph_traits<Graph>::halfedge_descriptor h,
@ -1895,13 +1894,18 @@ remove_degree_2_vertex(const typename boost::graph_traits<Graph>::halfedge_descr
bool exists; bool exists;
halfedge_descriptor huv; halfedge_descriptor huv;
std::tie(huv, exists) = halfedge(v1, v2, g); std::tie(huv, exists) = halfedge(v1, v2, g);
if(exists)
return boost::graph_traits<Graph>::null_halfedge();
if(is_border(h2, g)) if(is_border(h2, g))
{ {
CGAL_assertion(!is_border(h1, g)); CGAL_assertion(!is_border(h1, g));
if(exists)
{
Euler::remove_face(h1, g);
return huv;
}
else
{
halfedge_descriptor oh1 = opposite(h1, g); halfedge_descriptor oh1 = opposite(h1, g);
halfedge_descriptor nnh1 = next(next(h1, g), g); halfedge_descriptor nnh1 = next(next(h1, g), g);
halfedge_descriptor ph2 = prev(h2, g); halfedge_descriptor ph2 = prev(h2, g);
@ -1918,6 +1922,7 @@ remove_degree_2_vertex(const typename boost::graph_traits<Graph>::halfedge_descr
return h1; return h1;
} }
}
else else
{ {
CGAL_assertion(!is_border(h1, g) && !is_border(h2, g)); CGAL_assertion(!is_border(h1, g) && !is_border(h2, g));
@ -1925,6 +1930,10 @@ remove_degree_2_vertex(const typename boost::graph_traits<Graph>::halfedge_descr
halfedge_descriptor ph1 = prev(h1, g); halfedge_descriptor ph1 = prev(h1, g);
halfedge_descriptor ph2 = prev(h2, g); halfedge_descriptor ph2 = prev(h2, g);
Euler::remove_center_vertex(h, g); Euler::remove_center_vertex(h, g);
if(exists)
return huv;
else
return Euler::split_face(ph1, ph2, g); return Euler::split_face(ph1, ph2, g);
} }
} }