From 3b583dfc3fdb38b4058b0da2bec082ee3a9a5983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 Aug 2016 10:37:11 +0200 Subject: [PATCH 1/3] if the cost is undefined, remove the element from the queue --- .../include/CGAL/Polyline_simplification_2/simplify.h | 8 ++++++-- STL_Extension/include/CGAL/Modifiable_priority_queue.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index f2bb6e6c070..b62db109415 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -267,7 +267,9 @@ operator()() if((*u)->is_removable()){ boost::optional dist = cost(pct, u); if(! dist){ - std::cerr << "undefined cost not handled yet" << std::endl; + // cost is undefined + if( mpq->contains(u) ) + mpq->erase(u); } else { (*u)->set_cost(*dist); if((*mpq).contains(u)){ @@ -279,7 +281,9 @@ operator()() if((*w)->is_removable()){ boost::optional dist = cost(pct, w); if(! dist){ - std::cerr << "undefined cost not handled yet" << std::endl; + // cost is undefined + if( mpq->contains(w) ) + mpq->erase(w); } else { (*w)->set_cost(*dist); if((*mpq).contains(w)){ diff --git a/STL_Extension/include/CGAL/Modifiable_priority_queue.h b/STL_Extension/include/CGAL/Modifiable_priority_queue.h index 1671468eff4..066531c1bc4 100644 --- a/STL_Extension/include/CGAL/Modifiable_priority_queue.h +++ b/STL_Extension/include/CGAL/Modifiable_priority_queue.h @@ -98,6 +98,7 @@ public: handle update ( value_type const& v, handle h ) { mHeap.update(v); return h ; } handle erase ( value_type const& v, handle ) { mHeap.remove(v); return null_handle() ; } + handle erase ( value_type const& v ) { mHeap.remove(v); return null_handle() ; } value_type top() const { return mHeap.top() ; } From 9aaa3a81e672bc2be17d1439a0a744ff0f3c48fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 Aug 2016 11:04:51 +0200 Subject: [PATCH 2/3] insert in the queue if the cost become computable --- .../CGAL/Polyline_simplification_2/simplify.h | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index b62db109415..9f0f46f38e5 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -268,12 +268,16 @@ operator()() boost::optional dist = cost(pct, u); if(! dist){ // cost is undefined - if( mpq->contains(u) ) + if( mpq->contains(u) ){ mpq->erase(u); + } } else { (*u)->set_cost(*dist); - if((*mpq).contains(u)){ - (*mpq).update(u, true); + if(mpq->contains(u)){ + mpq->update(u, true); + } + else{ + mpq->push(u); } } } @@ -282,12 +286,16 @@ operator()() boost::optional dist = cost(pct, w); if(! dist){ // cost is undefined - if( mpq->contains(w) ) + if( mpq->contains(w) ){ mpq->erase(w); + } } else { (*w)->set_cost(*dist); - if((*mpq).contains(w)){ - (*mpq).update(w, true); + if(mpq->contains(w)){ + mpq->update(w, true); + } + else{ + mpq->push(w); } } From fad2f37a5eaf478149da35dbad72b37fdc0d44fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 Aug 2016 17:45:36 +0200 Subject: [PATCH 3/3] also test Scaled_squared_distance_cost --- .../Polyline_simplification_2/simplify_polygon_test.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Polyline_simplification_2/test/Polyline_simplification_2/simplify_polygon_test.cpp b/Polyline_simplification_2/test/Polyline_simplification_2/simplify_polygon_test.cpp index df03b5b99df..f179fa56384 100644 --- a/Polyline_simplification_2/test/Polyline_simplification_2/simplify_polygon_test.cpp +++ b/Polyline_simplification_2/test/Polyline_simplification_2/simplify_polygon_test.cpp @@ -18,10 +18,11 @@ typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; typedef CGAL::Constrained_triangulation_plus_2 CT; typedef CGAL::Polygon_2 Polygon_2; typedef PS::Stop_above_cost_threshold Stop; -typedef PS::Squared_distance_cost Cost; - +typedef PS::Squared_distance_cost Cost1; +typedef PS::Scaled_squared_distance_cost Cost2; +template void test(char* fname) { CGAL::Timer timer; @@ -45,7 +46,8 @@ int main(int argc, char* argv[]) { for(int i= 1;i < argc; i++){ - test(argv[i]); + test(argv[i]); + test(argv[i]); } return 0;