[core] Added util::polygonIntersectsPolygon

This commit is contained in:
Bruno de Oliveira Abinader
2016-10-25 01:39:33 +03:00
parent 679bfbfb32
commit fc6344c546
2 changed files with 16 additions and 23 deletions

View File

@@ -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<float>(p, v);
@@ -114,23 +106,23 @@ bool polygonIntersectsBufferedMultiLine(const GeometryCoordinates& polygon, cons
return false;
}
bool polygonIntersectsPolygon(const GeometryCoordinates& polygonA, const GeometryCoordinates& polygonB) {
for (auto& p : polygonA) {
if (polygonContainsPoint(polygonB, p)) return true;
}
for (auto& p : polygonB) {
if (polygonContainsPoint(polygonA, p)) return true;
}
if (lineIntersectsLine(polygonA, polygonB)) return true;
return false;
}
bool polygonIntersectsMultiPolygon(const GeometryCoordinates& polygon, const GeometryCollection& multiPolygon) {
if (polygon.size() == 1) {
return multiPolygonContainsPoint(multiPolygon, polygon.at(0));
}
for (auto& ring : multiPolygon) {
for (auto& p : ring) {
if (polygonContainsPoint(polygon, p)) return true;
}
}
for (auto& p : polygon) {
if (multiPolygonContainsPoint(multiPolygon, p)) return true;
}
for (auto& polygonB : multiPolygon) {
if (lineIntersectsLine(polygon, polygonB)) return true;
if (polygonIntersectsPolygon(polygon, ring)) return true;
}
return false;

View File

@@ -7,6 +7,7 @@ namespace util {
bool polygonIntersectsBufferedMultiPoint(const GeometryCoordinates&, const GeometryCollection&, float radius);
bool polygonIntersectsBufferedMultiLine(const GeometryCoordinates&, const GeometryCollection&, float radius);
bool polygonIntersectsPolygon(const GeometryCoordinates&, const GeometryCoordinates&);
bool polygonIntersectsMultiPolygon(const GeometryCoordinates&, const GeometryCollection&);
} // namespace util