From fc6344c5461c15956f425e39ee6c11dba638f46b Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Tue, 25 Oct 2016 01:39:33 +0300 Subject: [core] Added util::polygonIntersectsPolygon --- src/mbgl/util/intersection_tests.cpp | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) (limited to 'src/mbgl/util/intersection_tests.cpp') diff --git a/src/mbgl/util/intersection_tests.cpp b/src/mbgl/util/intersection_tests.cpp index a0feb8ec37..c580357298 100644 --- a/src/mbgl/util/intersection_tests.cpp +++ b/src/mbgl/util/intersection_tests.cpp @@ -16,14 +16,6 @@ bool polygonContainsPoint(const GeometryCoordinates& ring, const GeometryCoordin return c; } -bool multiPolygonContainsPoint(const GeometryCollection& rings, const GeometryCoordinate& p) { - bool c = false; - for (auto& ring : rings) { - c = (c != polygonContainsPoint(ring, p)); - } - return c; -} - // Code from http://stackoverflow.com/a/1501725/331379. float distToSegmentSquared(const GeometryCoordinate& p, const GeometryCoordinate& v, const GeometryCoordinate& w) { if (v == w) return util::distSqr(p, v); @@ -114,23 +106,23 @@ bool polygonIntersectsBufferedMultiLine(const GeometryCoordinates& polygon, cons return false; } -bool polygonIntersectsMultiPolygon(const GeometryCoordinates& polygon, const GeometryCollection& multiPolygon) { - if (polygon.size() == 1) { - return multiPolygonContainsPoint(multiPolygon, polygon.at(0)); +bool polygonIntersectsPolygon(const GeometryCoordinates& polygonA, const GeometryCoordinates& polygonB) { + for (auto& p : polygonA) { + if (polygonContainsPoint(polygonB, p)) return true; } - for (auto& ring : multiPolygon) { - for (auto& p : ring) { - if (polygonContainsPoint(polygon, p)) return true; - } + for (auto& p : polygonB) { + if (polygonContainsPoint(polygonA, p)) return true; } - for (auto& p : polygon) { - if (multiPolygonContainsPoint(multiPolygon, p)) return true; - } + if (lineIntersectsLine(polygonA, polygonB)) return true; - for (auto& polygonB : multiPolygon) { - if (lineIntersectsLine(polygon, polygonB)) return true; + return false; +} + +bool polygonIntersectsMultiPolygon(const GeometryCoordinates& polygon, const GeometryCollection& multiPolygon) { + for (auto& ring : multiPolygon) { + if (polygonIntersectsPolygon(polygon, ring)) return true; } return false; -- cgit v1.2.1