[core] Added util::polygonIntersectsPolygon
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user