diff --git a/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp b/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp index 373825f23..3934d1ba4 100644 --- a/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp +++ b/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp @@ -11,6 +11,7 @@ #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_MULTIPOLYGON_HPP #include +#include #include #include @@ -22,9 +23,12 @@ #include +#include + #include #include +#include #include #include @@ -71,6 +75,7 @@ private: TurnIterator turns_first, TurnIterator turns_beyond) { + // collect all polygons that have turns std::set multi_indices; for (TurnIterator tit = turns_first; tit != turns_beyond; ++tit) { @@ -78,28 +83,28 @@ private: multi_indices.insert(tit->operations[0].other_id.multi_index); } + // put polygon iterators without turns in a vector + std::vector polygon_iterators; int multi_index = 0; - for (PolygonIterator it1 = polygons_first; it1 != polygons_beyond; - ++it1, ++multi_index) + for (PolygonIterator it = polygons_first; it != polygons_beyond; + ++it, ++multi_index) { - if ( multi_indices.find(multi_index) != multi_indices.end() ) + if ( multi_indices.find(multi_index) == multi_indices.end() ) { - continue; - } - - for (PolygonIterator it2 = polygons_first; - it2 != polygons_beyond; ++it2) - { - if ( it1 != it2 - && - geometry::within(range::front(exterior_ring(*it1)), *it2) - ) - { - return false; - } + polygon_iterators.push_back(it); } } - return true; + + typename base::item_visitor visitor; + + geometry::partition + < + geometry::model::box::type>, + typename base::expand_box, + typename base::overlaps_box + >::apply(polygon_iterators, visitor); + + return !visitor.items_overlap; }