From 39da776bd7f696351364440427a6cd0b8fc3589e Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 12 May 2016 11:45:12 -0700 Subject: [core] Use mapbox::geometry::{box,envelope} --- src/mbgl/geometry/feature_index.cpp | 50 +++++++------------------------------ src/mbgl/text/collision_tile.cpp | 6 ++--- src/mbgl/text/collision_tile.hpp | 2 +- src/mbgl/util/grid_index.cpp | 26 +++++++++---------- src/mbgl/util/grid_index.hpp | 20 ++++++--------- 5 files changed, 34 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index 164431199e..fff2fbd075 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include #include @@ -21,23 +23,8 @@ void FeatureIndex::insert(const GeometryCollection& geometries, const std::string& sourceLayerName, const std::string& bucketName) { for (const auto& ring : geometries) { - float minX = std::numeric_limits::infinity(); - float minY = std::numeric_limits::infinity(); - float maxX = -std::numeric_limits::infinity(); - float maxY = -std::numeric_limits::infinity(); - - for (const auto& p : ring) { - const float x = p.x; - const float y = p.y; - minX = util::min(minX, x); - minY = util::min(minY, y); - maxX = util::max(maxX, x); - maxY = util::max(maxY, y); - } - - grid.insert( - IndexedSubfeature { index, sourceLayerName, bucketName, sortIndex++ }, - { int32_t(minX), int32_t(minY), int32_t(maxX), int32_t(maxY) }); + grid.insert(IndexedSubfeature { index, sourceLayerName, bucketName, sortIndex++ }, + mapbox::geometry::envelope(ring)); } } @@ -72,30 +59,11 @@ void FeatureIndex::query( const GeometryTile& geometryTile, const Style& style) const { - const float pixelsToTileUnits = util::EXTENT / tileSize / scale; - - float additionalRadius = style.getQueryRadius() * pixelsToTileUnits; + mapbox::geometry::box box = mapbox::geometry::envelope(queryGeometry); - float minX = std::numeric_limits::infinity(); - float minY = std::numeric_limits::infinity(); - float maxX = -std::numeric_limits::infinity(); - float maxY = -std::numeric_limits::infinity(); - - for (const auto& ring : queryGeometry) { - for (const auto& p : ring) { - minX = util::min(minX, p.x); - minY = util::min(minY, p.y); - maxX = util::max(maxX, p.x); - maxY = util::max(maxY, p.y); - } - } - - std::vector features = grid.query({ - int(minX - additionalRadius), - int(minY - additionalRadius), - int(maxX + additionalRadius), - int(maxY + additionalRadius) - }); + const float pixelsToTileUnits = util::EXTENT / tileSize / scale; + const int16_t additionalRadius = std::min(util::EXTENT, std::ceil(style.getQueryRadius() * pixelsToTileUnits)); + std::vector features = grid.query({ box.min - additionalRadius, box.max + additionalRadius }); std::sort(features.begin(), features.end(), topDown); size_t previousSortIndex = std::numeric_limits::max(); @@ -110,7 +78,7 @@ void FeatureIndex::query( // query symbol features assert(collisionTile); - std::vector symbolFeatures = collisionTile->queryRenderedSymbols(minX, minY, maxX, maxY, scale); + std::vector symbolFeatures = collisionTile->queryRenderedSymbols(box, scale); std::sort(symbolFeatures.begin(), symbolFeatures.end(), topDownSymbols); for (const auto& symbolFeature : symbolFeatures) { addFeature(result, symbolFeature, queryGeometry, filterLayerIDs, geometryTile, style, bearing, pixelsToTileUnits); diff --git a/src/mbgl/text/collision_tile.cpp b/src/mbgl/text/collision_tile.cpp index a7741d259a..e7824cde3c 100644 --- a/src/mbgl/text/collision_tile.cpp +++ b/src/mbgl/text/collision_tile.cpp @@ -153,13 +153,13 @@ Box CollisionTile::getTreeBox(const Point& anchor, const CollisionBox& bo }; } -std::vector CollisionTile::queryRenderedSymbols(const float minX, const float minY, const float maxX, const float maxY, const float scale) { +std::vector CollisionTile::queryRenderedSymbols(const mapbox::geometry::box& box, const float scale) { std::vector result; std::unordered_map> sourceLayerFeatures; - auto anchor = util::matrixMultiply(rotationMatrix, Point(minX, minY)); - CollisionBox queryBox(anchor, 0, 0, maxX - minX, maxY - minY, scale); + auto anchor = util::matrixMultiply(rotationMatrix, convertPoint(box.min)); + CollisionBox queryBox(anchor, 0, 0, box.max.x - box.min.x, box.max.y - box.min.y, scale); auto predicates = bgi::intersects(getTreeBox(anchor, queryBox)); auto fn = [&] (const Tree& tree_) { diff --git a/src/mbgl/text/collision_tile.hpp b/src/mbgl/text/collision_tile.hpp index 61d5af3134..0be2dabdbf 100644 --- a/src/mbgl/text/collision_tile.hpp +++ b/src/mbgl/text/collision_tile.hpp @@ -42,7 +42,7 @@ public: float placeFeature(const CollisionFeature&, const bool allowOverlap, const bool avoidEdges); void insertFeature(CollisionFeature&, const float minPlacementScale, const bool ignorePlacement); - std::vector queryRenderedSymbols(const float minX, const float minY, const float maxX, const float maxY, const float scale); + std::vector queryRenderedSymbols(const mapbox::geometry::box&, const float scale); const PlacementConfig config; diff --git a/src/mbgl/util/grid_index.cpp b/src/mbgl/util/grid_index.cpp index 8a2ee90213..4877a90e72 100644 --- a/src/mbgl/util/grid_index.cpp +++ b/src/mbgl/util/grid_index.cpp @@ -20,13 +20,13 @@ GridIndex::GridIndex(int32_t extent_, int32_t n_, int32_t padding_) : }; template -void GridIndex::insert(T&& t, BBox&& bbox) { +void GridIndex::insert(T&& t, const BBox& bbox) { size_t uid = elements.size(); - auto cx1 = convertToCellCoord(bbox.x1); - auto cy1 = convertToCellCoord(bbox.y1); - auto cx2 = convertToCellCoord(bbox.x2); - auto cy2 = convertToCellCoord(bbox.y2); + auto cx1 = convertToCellCoord(bbox.min.x); + auto cy1 = convertToCellCoord(bbox.min.y); + auto cx2 = convertToCellCoord(bbox.max.x); + auto cy2 = convertToCellCoord(bbox.max.y); for (int32_t x = cx1; x <= cx2; x++) { for (int32_t y = cy1; y <= cy2; y++) { @@ -43,10 +43,10 @@ std::vector GridIndex::query(const BBox& queryBBox) const { std::vector result; std::unordered_set seenUids; - auto cx1 = convertToCellCoord(queryBBox.x1); - auto cy1 = convertToCellCoord(queryBBox.y1); - auto cx2 = convertToCellCoord(queryBBox.x2); - auto cy2 = convertToCellCoord(queryBBox.y2); + auto cx1 = convertToCellCoord(queryBBox.min.x); + auto cy1 = convertToCellCoord(queryBBox.min.y); + auto cx2 = convertToCellCoord(queryBBox.max.x); + auto cy2 = convertToCellCoord(queryBBox.max.y); for (int32_t x = cx1; x <= cx2; x++) { for (int32_t y = cy1; y <= cy2; y++) { @@ -57,10 +57,10 @@ std::vector GridIndex::query(const BBox& queryBBox) const { auto& pair = elements.at(uid); auto& bbox = pair.second; - if (queryBBox.x1 <= bbox.x2 && - queryBBox.y1 <= bbox.y2 && - queryBBox.x2 >= bbox.x1 && - queryBBox.y2 >= bbox.y1) { + if (queryBBox.min.x <= bbox.max.x && + queryBBox.min.y <= bbox.max.y && + queryBBox.max.x >= bbox.min.x && + queryBBox.max.y >= bbox.min.y) { result.push_back(pair.first); } diff --git a/src/mbgl/util/grid_index.hpp b/src/mbgl/util/grid_index.hpp index c886e7ff48..656a4bdbd8 100644 --- a/src/mbgl/util/grid_index.hpp +++ b/src/mbgl/util/grid_index.hpp @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include #include #include @@ -8,22 +11,15 @@ namespace mbgl { template class GridIndex { - public: - +public: GridIndex(int32_t extent_, int32_t n_, int32_t padding_); - struct BBox { - int32_t x1; - int32_t y1; - int32_t x2; - int32_t y2; - }; - - void insert(T&& t, BBox&& bbox); - std::vector query(const BBox& bbox) const; + using BBox = mapbox::geometry::box; - private: + void insert(T&& t, const BBox&); + std::vector query(const BBox&) const; +private: int32_t convertToCellCoord(int32_t x) const; const int32_t extent; -- cgit v1.2.1