From aeac816801819212ed9e1d1b96e26246f8a56ec0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 25 Jun 2019 15:06:10 +0200 Subject: [PATCH 1/2] Triangulation_2: Fix remove_vertex_from_constraint-GF --- .../CGAL/Polyline_constraint_hierarchy_2.h | 6 +- .../test/Triangulation_2/issue_4025.cpp | 89 +++++++++++++++++++ 2 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 Triangulation_2/test/Triangulation_2/issue_4025.cpp diff --git a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h index 1f3071db44e..7731a8686ec 100644 --- a/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Polyline_constraint_hierarchy_2.h @@ -760,13 +760,13 @@ Polyline_constraint_hierarchy_2::concatenate2(Constraint_id firs // now we really concatenate the vertex lists // Note that all iterators pointing into second remain valid. first.vl_ptr()->pop_back(); // because it is the same as second.front() - Vertex_it back_it = first.vl_ptr()->skip_end(); - --back_it; + Vertex_it back_it = second.vl_ptr()->skip_begin(); + second.vl_ptr()->splice(second.vl_ptr()->skip_begin(), *(first.vl_ptr()), first.vl_ptr()->skip_begin(), first.vl_ptr()->skip_end()); // Note that for VC8 with iterator debugging the iterators pointing into second // are NOT valid So we have to update them - for(Vertex_it it = back_it, succ = it, end = first.vl_ptr()->skip_end(); + for(Vertex_it it = second.vl_ptr()->skip_begin(), succ = it, end = back_it; ++succ != end; ++it){ typename Sc_to_c_map::iterator scit = sc_to_c_map.find(make_edge(*it,*succ)); diff --git a/Triangulation_2/test/Triangulation_2/issue_4025.cpp b/Triangulation_2/test/Triangulation_2/issue_4025.cpp new file mode 100644 index 00000000000..56c6e483ba0 --- /dev/null +++ b/Triangulation_2/test/Triangulation_2/issue_4025.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include + + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Polygon_2 Polygon_2; +typedef CGAL::Exact_intersections_tag Itag_; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +typedef CGAL::Constrained_triangulation_plus_2 CDTP; + +typedef CDTP::Point Point; +typedef CDTP::Constraint_id Cid; +typedef CDTP::Vertex_handle Vertex_handle; + + + +int countVertex(CDTP &cdtp, CDTP::Constraint_id id) +{ + auto v=cdtp.vertices_in_constraint_begin(id); + + int count=0; + while(v!=cdtp.vertices_in_constraint_end(id)) + { + count++; + v++; + } + + return count; +} + + +int main() +{ + CDTP cdtp; + + std::list pointsListCollinear; + + pointsListCollinear.push_back(Point(0,0)); + pointsListCollinear.push_back(Point(0,1)); + pointsListCollinear.push_back(Point(0,2)); + pointsListCollinear.push_back(Point(0,3)); + pointsListCollinear.push_back(Point(0,4)); + pointsListCollinear.push_back(Point(0,5)); + + std::list pointsListNoCollinear; + + pointsListNoCollinear.push_back(Point(1,0)); + pointsListNoCollinear.push_back(Point(2,1)); + pointsListNoCollinear.push_back(Point(4,2)); + pointsListNoCollinear.push_back(Point(2,3)); + pointsListNoCollinear.push_back(Point(4,4)); + pointsListNoCollinear.push_back(Point(1,5)); + + + auto ctIdCollinear=cdtp.insert_constraint(pointsListCollinear.begin(),pointsListCollinear.end()); + auto ctIdNoCollinear=cdtp.insert_constraint(pointsListNoCollinear.begin(),pointsListNoCollinear.end()); + + + //******************************* attempt with the collinear constraint + auto vertexToRemoveCollinear=cdtp.vertices_in_constraint_begin(ctIdCollinear); + vertexToRemoveCollinear++; + vertexToRemoveCollinear++; + + + std::cout<<"attempt to remove vertex "<<(*vertexToRemoveCollinear)->point().x()<<" , "<<(*vertexToRemoveCollinear)->point().y() < 5, expected 4 + std::cout<<"number of constraints "< 1 + std::cout<<"number of vertex in constraint "< 6, expected 5 + + + //******************************* attempt with the collinear constraint + auto vertexToRemoveNoCollinear=cdtp.vertices_in_constraint_begin(ctIdNoCollinear); + vertexToRemoveNoCollinear++; + vertexToRemoveNoCollinear++; + + std::cout<<"attempt to remove vertex "<<(*vertexToRemoveNoCollinear)->point().x()<<" , "<<(*vertexToRemoveNoCollinear)->point().y() << std::endl; + cdtp.remove_vertex_from_constraint(ctIdNoCollinear,vertexToRemoveNoCollinear); + + std::cout<<"number of subconstraints "< 4, ok + std::cout<<"number of constraints "< 1 + std::cout<<"number of vertex in constraint "< 5, ok + + return 0; + +} From 060ec7c5c2a54e733209ac0a84f55016fa4a025d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 26 Jun 2019 14:47:35 +0200 Subject: [PATCH 2/2] No auto --- .../test/Triangulation_2/issue_4025.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Triangulation_2/test/Triangulation_2/issue_4025.cpp b/Triangulation_2/test/Triangulation_2/issue_4025.cpp index 56c6e483ba0..af37b05ac06 100644 --- a/Triangulation_2/test/Triangulation_2/issue_4025.cpp +++ b/Triangulation_2/test/Triangulation_2/issue_4025.cpp @@ -13,12 +13,12 @@ typedef CGAL::Constrained_triangulation_plus_2 CDTP; typedef CDTP::Point Point; typedef CDTP::Constraint_id Cid; typedef CDTP::Vertex_handle Vertex_handle; - - +typedef CDTP::Constraint_id Constraint_id; +typedef CDTP::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; int countVertex(CDTP &cdtp, CDTP::Constraint_id id) { - auto v=cdtp.vertices_in_constraint_begin(id); + Vertices_in_constraint_iterator v=cdtp.vertices_in_constraint_begin(id); int count=0; while(v!=cdtp.vertices_in_constraint_end(id)) @@ -54,12 +54,12 @@ int main() pointsListNoCollinear.push_back(Point(1,5)); - auto ctIdCollinear=cdtp.insert_constraint(pointsListCollinear.begin(),pointsListCollinear.end()); - auto ctIdNoCollinear=cdtp.insert_constraint(pointsListNoCollinear.begin(),pointsListNoCollinear.end()); + Constraint_id ctIdCollinear=cdtp.insert_constraint(pointsListCollinear.begin(),pointsListCollinear.end()); + Constraint_id ctIdNoCollinear=cdtp.insert_constraint(pointsListNoCollinear.begin(),pointsListNoCollinear.end()); //******************************* attempt with the collinear constraint - auto vertexToRemoveCollinear=cdtp.vertices_in_constraint_begin(ctIdCollinear); + Vertices_in_constraint_iterator vertexToRemoveCollinear=cdtp.vertices_in_constraint_begin(ctIdCollinear); vertexToRemoveCollinear++; vertexToRemoveCollinear++; @@ -73,7 +73,7 @@ int main() //******************************* attempt with the collinear constraint - auto vertexToRemoveNoCollinear=cdtp.vertices_in_constraint_begin(ctIdNoCollinear); + Vertices_in_constraint_iterator vertexToRemoveNoCollinear=cdtp.vertices_in_constraint_begin(ctIdNoCollinear); vertexToRemoveNoCollinear++; vertexToRemoveNoCollinear++;