From e54c24f0a47e0b13cd7b2edd2390d2edfe4a5be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 15 Apr 2019 16:58:22 +0200 Subject: [PATCH 1/4] correct forwarding of projection traits --- .../include/CGAL/Extreme_points_traits_adapter_3.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Convex_hull_3/include/CGAL/Extreme_points_traits_adapter_3.h b/Convex_hull_3/include/CGAL/Extreme_points_traits_adapter_3.h index 8991774adc3..8c84e567ca7 100644 --- a/Convex_hull_3/include/CGAL/Extreme_points_traits_adapter_3.h +++ b/Convex_hull_3/include/CGAL/Extreme_points_traits_adapter_3.h @@ -221,16 +221,17 @@ public: Orientation_2 orientation_2_object ()const{return Orientation_2(vpm_,static_cast(this)->orientation_2_object() );} }; - typedef Proj_traits_3 Traits_xy_3; - typedef Proj_traits_3 Traits_yz_3; - typedef Proj_traits_3 Traits_xz_3; + typedef internal::Convex_hull_3::Projection_traits Base_PTraits; + typedef Proj_traits_3 Traits_xy_3; + typedef Proj_traits_3 Traits_yz_3; + typedef Proj_traits_3 Traits_xz_3; Traits_xy_3 construct_traits_xy_3_object()const - {return Traits_xy_3(vpm_, static_cast(this)->construct_traits_xy_3_object());} + {return Traits_xy_3(vpm_, Base_PTraits(static_cast(*this)).construct_traits_xy_3_object());} Traits_yz_3 construct_traits_yz_3_object()const - {return Traits_yz_3(vpm_, static_cast(this)->construct_traits_yz_3_object());} + {return Traits_yz_3(vpm_, Base_PTraits(static_cast(*this)).construct_traits_yz_3_object());} Traits_xz_3 construct_traits_xz_3_object()const - {return Traits_xz_3(vpm_, static_cast(this)->construct_traits_xz_3_object());} + {return Traits_xz_3(vpm_, Base_PTraits(static_cast(*this)).construct_traits_xz_3_object());} typename boost::property_traits::reference get_point(const typename boost::property_traits::key_type& k) const From d3128e75e544272f6d3c79299108cb311a86c155 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 17 Apr 2019 22:03:28 +0200 Subject: [PATCH 2/4] We need two versions of the insert_constraint() function, - one for the old API where constraints were just a 2d segment - and one for polylines --- .../CGAL/Constrained_triangulation_plus_2.h | 2 +- .../CGAL/Polyline_constraint_hierarchy_2.h | 31 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index 248159481ed..255abb52a11 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -271,7 +271,7 @@ public: return Constraint_id(NULL); } // protects against inserting twice the same constraint - Constraint_id cid = hierarchy.insert_constraint(va, vb); + Constraint_id cid = hierarchy.insert_constraint_old_API(va, vb); if (va != vb && (cid != Constraint_id(NULL)) ) insert_subconstraint(va,vb); return cid; diff --git a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h index 2c1654cece4..a1c9c73ea42 100644 --- a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h @@ -247,7 +247,8 @@ public: // insert/remove void add_Steiner(T va, T vb, T vx); - Vertex_list* insert_constraint(T va, T vb); + Vertex_list* insert_constraint_old_API(T va, T vb); + Vertex_list* insert_constraint(T va, T vb); void append_constraint(Constraint_id cid, T va, T vb); void swap(Constraint_id first, Constraint_id second); void remove_constraint(Constraint_id cid); @@ -868,6 +869,34 @@ typename Polyline_constraint_hierarchy_2::Vertex_list* Polyline_constraint_hierarchy_2:: insert_constraint(T va, T vb){ Edge he = make_edge(va, vb); + Vertex_list* children = new Vertex_list; + Context_list* fathers; + + typename Sc_to_c_map::iterator scit = sc_to_c_map.find(he); + if(scit == sc_to_c_map.end()){ + fathers = new Context_list; + sc_to_c_map.insert(std::make_pair(he,fathers)); + } else { + fathers = scit->second; + } + + children->push_front(Node(va, true)); // was he.first + children->push_back(Node(vb, true)); // was he.second + constraint_set.insert(children); + Context ctxt; + ctxt.enclosing = children; + ctxt.pos = children->skip_begin(); + fathers->push_front(ctxt); + + return children; +} + + +template +typename Polyline_constraint_hierarchy_2::Vertex_list* +Polyline_constraint_hierarchy_2:: +insert_constraint_old_API(T va, T vb){ + Edge he = make_edge(va, vb); // First, check if the constraint was already inserted. // If it was not, then the iterator to the lower bound will serve as From f1c6990a57a35582e71fc64696b75264a369f731 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 18 Apr 2019 13:36:41 +0200 Subject: [PATCH 3/4] Add a test for a reported issue --- .../test/Triangulation_2/issue_3447.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Triangulation_2/test/Triangulation_2/issue_3447.cpp diff --git a/Triangulation_2/test/Triangulation_2/issue_3447.cpp b/Triangulation_2/test/Triangulation_2/issue_3447.cpp new file mode 100644 index 00000000000..de0a47601d0 --- /dev/null +++ b/Triangulation_2/test/Triangulation_2/issue_3447.cpp @@ -0,0 +1,34 @@ +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Triangulation_vertex_base_2 Vb; +typedef CGAL::Constrained_triangulation_face_base_2 Fb; +typedef CGAL::Triangulation_data_structure_2 TDS; +typedef CGAL::Exact_predicates_tag Itag; +typedef CGAL::Constrained_Delaunay_triangulation_2 Triangulation; +typedef CGAL::Constrained_triangulation_plus_2 Delaunay; + +typedef K::Point_2 Point_2; + +int main() +{ + Delaunay dt; + + dt.insert(Point_2(0,0)); + dt.insert(Point_2(10,0)); + dt.insert(Point_2(0,10)); + dt.insert(Point_2(10,10)); + + std::vector vec_constraint; + + vec_constraint.push_back(Point_2(1, 2)); + vec_constraint.push_back(Point_2(2, 2)); + vec_constraint.push_back(Point_2(3, 2)); + + dt.insert_constraint(vec_constraint.begin(), vec_constraint.end()); + + dt.insert_constraint(vec_constraint.begin(), vec_constraint.end()); + + return 0; +} From 14ebc2fabc56bae94d6b6c2e81b03611c2a23695 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Thu, 18 Apr 2019 13:54:46 +0200 Subject: [PATCH 4/4] Update Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h Co-Authored-By: afabri --- Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h index a1c9c73ea42..1f3071db44e 100644 --- a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h @@ -248,7 +248,7 @@ public: // insert/remove void add_Steiner(T va, T vb, T vx); Vertex_list* insert_constraint_old_API(T va, T vb); - Vertex_list* insert_constraint(T va, T vb); + Vertex_list* insert_constraint(T va, T vb); void append_constraint(Constraint_id cid, T va, T vb); void swap(Constraint_id first, Constraint_id second); void remove_constraint(Constraint_id cid);