From b2683f48f23a9db0a577ca52b6c7edeeb4c8c0a2 Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Tue, 4 Nov 2014 22:02:47 +0200 Subject: [PATCH 1/2] [strategies][cartesian][cart_intersect] fix bug in Cartesian segment-segment intersection strategy; Bug: when exactly one segment degenerates to a point and is collinear with the other segment, the strategy always sets the intersection count to 1; Fix: check if the degenerate segment lies within the non-degenerate one before setting the intersection count; if the point is outside the non-degenerate segment declare the two segments as disjoint; --- .../boost/geometry/strategies/cartesian/cart_intersect.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/boost/geometry/strategies/cartesian/cart_intersect.hpp b/include/boost/geometry/strategies/cartesian/cart_intersect.hpp index 66af2d2e9..8f2c53e2a 100644 --- a/include/boost/geometry/strategies/cartesian/cart_intersect.hpp +++ b/include/boost/geometry/strategies/cartesian/cart_intersect.hpp @@ -351,6 +351,12 @@ private: // b1/b2 (4..4) // Ratio: (4-2)/(6-2) RatioType const ratio(d - s1, s2 - s1); + + if (!ratio.on_segment()) + { + return Policy::disjoint(); + } + return Policy::one_degenerate(degenerate_segment, ratio, a_degenerate); } }; From 1b638c66fc9b833296db4839bc11669956b82664 Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Tue, 4 Nov 2014 22:06:18 +0200 Subject: [PATCH 2/2] [test][distance] add some more P/L and L/L test cases; some of them have triggered the bug in the Cartesian segment-segment intersection strategy and the distance has produced wrong results; with the fix in the Cartesian segment-segment intersection strategy, the distance computation test cases added succeed; --- .../distance/distance_linear_linear.cpp | 16 ++++++++++++++++ .../distance/distance_pointlike_linear.cpp | 15 +++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/test/algorithms/distance/distance_linear_linear.cpp b/test/algorithms/distance/distance_linear_linear.cpp index 9c329e429..72c75805d 100644 --- a/test/algorithms/distance/distance_linear_linear.cpp +++ b/test/algorithms/distance/distance_linear_linear.cpp @@ -75,6 +75,10 @@ void test_distance_segment_linestring(Strategy const& strategy) tester::apply("segment(1 1,2 2)", "linestring(2 1,1 2,4 0)", 0, 0, strategy); + + tester::apply("segment(1 1,2 2)", + "linestring(3 3,3 3)", + sqrt(2.0), 2, strategy); } //=========================================================================== @@ -155,6 +159,10 @@ void test_distance_segment_multilinestring(Strategy const& strategy) tester::apply("segment(1 1,2 2)", "multilinestring((2 1,1 2),(4 0,4 10))", 0, 0, strategy); + + tester::apply("segment(1 1,2 2)", + "multilinestring((2.5 0,4 0,5 0),(3 3,3 3))", + sqrt(2.0), 2, strategy); } //=========================================================================== @@ -179,6 +187,14 @@ void test_distance_linestring_multilinestring(Strategy const& strategy) tester::apply("linestring(1 1,2 2,3 3)", "multilinestring((1 -10,2 0,2.1 -10,4 0),(1 -10,2 1.9,2.1 -10,4 0))", sqrt(0.005), 0.005, strategy, true); + + tester::apply("linestring(1 1,2 2)", + "multilinestring((2.5 0,4 0,5 0),(3 3,3 3))", + sqrt(2.0), 2, strategy); + + tester::apply("linestring(1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9)", + "multilinestring((2.5 0,4 0,5 0),(10 10,10 10))", + sqrt(2.0), 2, strategy); } //=========================================================================== diff --git a/test/algorithms/distance/distance_pointlike_linear.cpp b/test/algorithms/distance/distance_pointlike_linear.cpp index cc5fce764..742554259 100644 --- a/test/algorithms/distance/distance_pointlike_linear.cpp +++ b/test/algorithms/distance/distance_pointlike_linear.cpp @@ -99,6 +99,18 @@ void test_distance_point_multilinestring(Strategy const& strategy) tester::apply("point(2.5 0)", "multilinestring((-5 0,-3 0),(2 0,3 0))", 0, 0, strategy); + tester::apply("POINT(0 0)", + "MULTILINESTRING((10 10,10 0),(0.0 -0.0,0.0 -0.0))", + 0, 0, strategy); + tester::apply("POINT(0 0)", + "MULTILINESTRING((10 10,10 0),(1 1,1 1))", + sqrt(2.0), 2, strategy); + tester::apply("POINT(0 0)", + "MULTILINESTRING((10 10,10 0),(1 1,2 2))", + sqrt(2.0), 2, strategy); + tester::apply("POINT(0 0)", + "MULTILINESTRING((10 10,10 0),(20 20,20 20))", + 10, 100, strategy); } //=========================================================================== @@ -180,6 +192,9 @@ void test_distance_multipoint_segment(Strategy const& strategy) tester::apply("multipoint(0 0,1 0,0 1,1 1)", "segment(3 3,4 4)", sqrt(8.0), 8, strategy); + tester::apply("multipoint(4 4,5 5,2 2,3 3)", + "segment(0 0,1 1)", + sqrt(2.0), 2, strategy); } //===========================================================================