From 27e50d43e17e2c72e63ecdd868e4080c9767ec1a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 17 Mar 2023 13:27:20 +0100 Subject: [PATCH] Facet can be recovered by other operation --- .../Constrained_Delaunay_triangulation_3.h | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h b/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h index a48cfdb47cc..c6eb26418e5 100644 --- a/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h @@ -1154,8 +1154,10 @@ private: for(const auto [f, f2d] : new_constrained_facets) { const auto [c, i] = f; c->set_facet_constraint(i, face_index, f2d); - const auto [c2, i2] = this->mirror_facet(f); - c2->set_facet_constraint(i2, face_index, f2d); + if(tr.dimension() > 2) { + const auto [c2, i2] = this->mirror_facet(f); + c2->set_facet_constraint(i2, face_index, f2d); + } f2d->info().missing_subface = false; } CGAL_assertion(this->T_3::Tr_Base::is_valid(true)); @@ -1337,13 +1339,29 @@ private: int region_count = 0; for(const CDT_2_face_handle fh : cdt_2.finite_face_handles()) { if(fh->info().is_outside_the_face) continue; - CGAL_assertion((fh->info().missing_subface == false) == tr.is_facet(fh->vertex(0)->info().vertex_handle_3d, - fh->vertex(1)->info().vertex_handle_3d, - fh->vertex(2)->info().vertex_handle_3d)); + CGAL_assertion(tr.is_facet(fh->vertex(0)->info().vertex_handle_3d, + fh->vertex(1)->info().vertex_handle_3d, + fh->vertex(2)->info().vertex_handle_3d) || + (fh->info().missing_subface == true)); if(false == fh->info().missing_subface) { continue; } - if(processed_faces.contains(fh)) continue; + Cell_handle c; + int i, j, k; + if(tr.is_facet(fh->vertex(0)->info().vertex_handle_3d, fh->vertex(1)->info().vertex_handle_3d, + fh->vertex(2)->info().vertex_handle_3d, c, i, j, k)) + { + const int facet_index = 6 - i - j - k; + c->set_facet_constraint(facet_index, face_index, fh); + if(tr.dimension() > 2) { + const auto [c2, i2] = this->mirror_facet({c, facet_index}); + c2->set_facet_constraint(i2, face_index, fh); + } + fh->info().missing_subface = false; + continue; + } + if(processed_faces.contains(fh)) + continue; const auto fh_region = region(cdt_2, fh); processed_faces.insert(fh_region.begin(), fh_region.end()); try {