From fc6ddc9dee5bdd54c19aff897ffdf5cad7dd335c Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Wed, 8 Jun 2022 19:51:04 +0200 Subject: [PATCH] [relate][test][equals] Fix relate for GC special case --- .../detail/relate/implementation_gc.hpp | 113 +++++++++++------- test/algorithms/equals/equals_gc.cpp | 10 +- test/algorithms/relate/relate_gc.cpp | 6 +- 3 files changed, 74 insertions(+), 55 deletions(-) diff --git a/include/boost/geometry/algorithms/detail/relate/implementation_gc.hpp b/include/boost/geometry/algorithms/detail/relate/implementation_gc.hpp index 85b75f009..8bb752fef 100644 --- a/include/boost/geometry/algorithms/detail/relate/implementation_gc.hpp +++ b/include/boost/geometry/algorithms/detail/relate/implementation_gc.hpp @@ -14,6 +14,8 @@ #include #include +#include +#include #include #include #include @@ -158,32 +160,53 @@ struct relate(tuple1)) + && ! geometry::is_empty(boost::get<1>(tuple2))) + { + inters_found[0][1] = true; + inters_found[1][1] = true; + mls2_t mls2_diff_mpo1; + geometry::difference(boost::get<1>(tuple2), boost::get<2>(tuple1), mls2_diff_mpo1); + mls1_t mls1_diff_mpo2; + geometry::difference(boost::get<1>(tuple1), boost::get<2>(tuple2), mls1_diff_mpo2); + if (! geometry::is_empty(mls2_diff_mpo1) + && ! geometry::is_empty(mls1_diff_mpo2)) + { + is_ll_handled = true; + call_relate(mls1_diff_mpo2, mls2_diff_mpo1, result, strategy); + } + } + if (! geometry::is_empty(boost::get<2>(tuple1))) { inters_found[0][2] = true; if (! geometry::is_empty(boost::get<2>(tuple2))) { inters_found[1][2] = true; - dispatch::relate - < - mpo1_t, mpo2_t - >::apply(boost::get<2>(tuple1), boost::get<2>(tuple2), result, strategy); + call_relate(boost::get<2>(tuple1), boost::get<2>(tuple2), result, strategy); } if (! geometry::is_empty(boost::get<1>(tuple2))) { inters_found[1][1] = true; - dispatch::relate - < - mpo1_t, mls2_t - >::apply(boost::get<2>(tuple1), boost::get<1>(tuple2), result, strategy); + if (is_ll_handled) + { + mls1_t mls2_inters_mpo1; + geometry::intersection(boost::get<1>(tuple2), boost::get<2>(tuple1), mls2_inters_mpo1); + if (! geometry::is_empty(mls2_inters_mpo1)) + { + call_relate(boost::get<2>(tuple1), mls2_inters_mpo1, result, strategy); + } + } + else + { + call_relate(boost::get<2>(tuple1), boost::get<1>(tuple2), result, strategy); + } } if (! geometry::is_empty(boost::get<0>(tuple2))) { inters_found[1][0] = true; - dispatch::relate - < - mpo1_t, mpt2_t - >::apply(boost::get<2>(tuple1), boost::get<0>(tuple2), result, strategy); + call_relate(boost::get<2>(tuple1), boost::get<0>(tuple2), result, strategy); } } if (! geometry::is_empty(boost::get<1>(tuple1))) @@ -192,26 +215,24 @@ struct relate(tuple2))) { inters_found[1][2] = true; - dispatch::relate - < - mls1_t, mpo2_t - >::apply(boost::get<1>(tuple1), boost::get<2>(tuple2), result, strategy); - } - if (! geometry::is_empty(boost::get<1>(tuple2))) - { - inters_found[1][1] = true; - dispatch::relate - < - mls1_t, mls2_t - >::apply(boost::get<1>(tuple1), boost::get<1>(tuple2), result, strategy); + if (is_ll_handled) + { + mls1_t mls1_inters_mpo2; + geometry::intersection(boost::get<1>(tuple1), boost::get<2>(tuple2), mls1_inters_mpo2); + if (! geometry::is_empty(mls1_inters_mpo2)) + { + call_relate(mls1_inters_mpo2, boost::get<2>(tuple2), result, strategy); + } + } + else + { + call_relate(boost::get<1>(tuple1), boost::get<2>(tuple2), result, strategy); + } } if (! geometry::is_empty(boost::get<0>(tuple2))) { inters_found[1][0] = true; - dispatch::relate - < - mls1_t, mpt2_t - >::apply(boost::get<1>(tuple1), boost::get<0>(tuple2), result, strategy); + call_relate(boost::get<1>(tuple1), boost::get<0>(tuple2), result, strategy); } } if (! geometry::is_empty(boost::get<0>(tuple1))) @@ -220,26 +241,17 @@ struct relate(tuple2))) { inters_found[1][2] = true; - dispatch::relate - < - mpt1_t, mpo2_t - >::apply(boost::get<0>(tuple1), boost::get<2>(tuple2), result, strategy); + call_relate(boost::get<0>(tuple1), boost::get<2>(tuple2), result, strategy); } if (! geometry::is_empty(boost::get<1>(tuple2))) { inters_found[1][1] = true; - dispatch::relate - < - mpt1_t, mls2_t - >::apply(boost::get<0>(tuple1), boost::get<1>(tuple2), result, strategy); + call_relate(boost::get<0>(tuple1), boost::get<1>(tuple2), result, strategy); } if (! geometry::is_empty(boost::get<0>(tuple2))) { inters_found[1][0] = true; - dispatch::relate - < - mpt1_t, mpt2_t - >::apply(boost::get<0>(tuple1), boost::get<0>(tuple2), result, strategy); + call_relate(boost::get<0>(tuple1), boost::get<0>(tuple2), result, strategy); } } }, @@ -333,24 +345,24 @@ private: template static inline void subtract_elements(Tuple& tuple, Strategy const& strategy) { - if (! boost::empty(boost::get<1>(tuple))) + if (! geometry::is_empty(boost::get<1>(tuple))) { - if (! boost::empty(boost::get<2>(tuple))) + if (! geometry::is_empty(boost::get<2>(tuple))) { typename boost::tuples::element<1, Tuple>::type mls; geometry::difference(boost::get<1>(tuple), boost::get<2>(tuple), mls, strategy); boost::get<1>(tuple) = std::move(mls); } } - if (! boost::empty(boost::get<0>(tuple))) + if (! geometry::is_empty(boost::get<0>(tuple))) { - if (! boost::empty(boost::get<2>(tuple))) + if (! geometry::is_empty(boost::get<2>(tuple))) { typename boost::tuples::element<0, Tuple>::type mpt; geometry::difference(boost::get<0>(tuple), boost::get<2>(tuple), mpt, strategy); boost::get<0>(tuple) = std::move(mpt); } - if (! boost::empty(boost::get<1>(tuple))) + if (! geometry::is_empty(boost::get<1>(tuple))) { typename boost::tuples::element<0, Tuple>::type mpt; geometry::difference(boost::get<0>(tuple), boost::get<1>(tuple), mpt, strategy); @@ -379,6 +391,17 @@ private: { return false; } + + + template + static inline void call_relate(Multi1 const& multi1, Multi2 const& multi2, + Result& result, Strategy const& strategy) + { + dispatch::relate + < + Multi1, Multi2 + >::apply(multi1, multi2, result, strategy); + } }; diff --git a/test/algorithms/equals/equals_gc.cpp b/test/algorithms/equals/equals_gc.cpp index d9edcc3b2..10b13f4ec 100644 --- a/test/algorithms/equals/equals_gc.cpp +++ b/test/algorithms/equals/equals_gc.cpp @@ -29,17 +29,15 @@ void test_gc() test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6))", "GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 4, 4 1))", false); - // ERROR in relate - /*test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6))", + test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6))", "GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(5 5, 6 6))", - true);*/ + true); test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6), POINT(0 6))", "GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(5 5, 6 6))", false); - // ERROR in relate - /*test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6), POINT(0 6))", + test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6), POINT(0 6))", "GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(5 5, 6 6), POINT(0 6))", - true);*/ + true); test_geometry("POLYGON((0 0,0 5,5 5,5 0,0 0))", diff --git a/test/algorithms/relate/relate_gc.cpp b/test/algorithms/relate/relate_gc.cpp index 39a3f17ba..b44081729 100644 --- a/test/algorithms/relate/relate_gc.cpp +++ b/test/algorithms/relate/relate_gc.cpp @@ -52,11 +52,9 @@ void test_gc_gc() "GEOMETRYCOLLECTION(LINESTRING(0 0, 1 1), LINESTRING(1 1, 2 2))", "0FFFFF102"); - - // ERROR - /*test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6))", + test_geometry("GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(1 1, 6 6))", "GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)), LINESTRING(5 5, 6 6))", - "2FF1FFFF2");*/ + "2FFF1FFF2"); } void test_g_gc()