summaryrefslogtreecommitdiff
path: root/src/mbgl/style/expression/within.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/expression/within.cpp')
-rw-r--r--src/mbgl/style/expression/within.cpp31
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: