diff options
Diffstat (limited to 'src/mbgl/style/expression/within.cpp')
-rw-r--r-- | src/mbgl/style/expression/within.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/mbgl/style/expression/within.cpp b/src/mbgl/style/expression/within.cpp index 99449a50bd..a3e2500319 100644 --- a/src/mbgl/style/expression/within.cpp +++ b/src/mbgl/style/expression/within.cpp @@ -5,6 +5,7 @@ #include <mbgl/style/conversion/json.hpp> #include <mbgl/tile/geometry_tile_data.hpp> +#include <mbgl/util/geometry_util.hpp> #include <mbgl/util/logging.hpp> #include <mbgl/util/string.hpp> @@ -14,6 +15,29 @@ namespace mbgl { namespace { +// contains minX, minY, maxX, maxY +using WithinBBox = std::array<int64_t, 4>; +const WithinBBox DefaultBBox = WithinBBox{std::numeric_limits<int64_t>::max(), + std::numeric_limits<int64_t>::max(), + std::numeric_limits<int64_t>::min(), + std::numeric_limits<int64_t>::min()}; + +// check if bbox1 is within bbox2 +void updateBBox(WithinBBox& bbox, const Point<int64_t>& p) { + bbox[0] = std::min(p.x, bbox[0]); + bbox[1] = std::min(p.y, bbox[1]); + bbox[2] = std::max(p.x, bbox[2]); + bbox[3] = std::max(p.y, bbox[3]); +} + +bool boxWithinBox(const WithinBBox& bbox1, const WithinBBox& bbox2) { + if (bbox1[0] <= bbox2[0]) return false; + if (bbox1[2] >= bbox2[2]) return false; + if (bbox1[1] <= bbox2[1]) return false; + if (bbox1[3] >= bbox2[3]) return false; + return true; +} + Point<int64_t> latLonToTileCoodinates(const Point<double>& point, const mbgl::CanonicalTileID& canonical) { const double size = util::EXTENT * std::pow(2, canonical.z); @@ -149,8 +173,9 @@ bool featureWithinPolygons(const GeometryTileFeature& feature, MultiPoint<int64_t> points = getTilePoints(geometries.at(0), canonical, pointBBox, polyBBox); if (!boxWithinBox(pointBBox, polyBBox)) return false; - return std::all_of( - points.begin(), points.end(), [&polygons](const auto& p) { return pointWithinPolygons(p, polygons); }); + return std::all_of(points.begin(), points.end(), [&polygons](const auto& p) { + return GeometryUtil<int64_t>::pointWithinPolygons(p, polygons); + }); } case FeatureType::LineString: { WithinBBox lineBBox = DefaultBBox; @@ -158,7 +183,7 @@ bool featureWithinPolygons(const GeometryTileFeature& feature, if (!boxWithinBox(lineBBox, polyBBox)) return false; return std::all_of(multiLineString.begin(), multiLineString.end(), [&polygons](const auto& line) { - return lineStringWithinPolygons(line, polygons); + return GeometryUtil<int64_t>::lineStringWithinPolygons(line, polygons); }); } default: |