From 667a08f6fc19e7b9ca679298ad33f1986e93efd9 Mon Sep 17 00:00:00 2001 From: Aleksandar Stojiljkovic Date: Mon, 5 Aug 2019 18:16:26 +0300 Subject: [core] Tile cover LOD: lod covers single level tile cover Unit test verifies that, with different camera parameters combinations LOD tile cover covers all tiles returned by single level tileCover. --- src/mbgl/util/tile_cover.cpp | 3 +++ test/util/tile_cover.test.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/mbgl/util/tile_cover.cpp b/src/mbgl/util/tile_cover.cpp index 11e1a97f4c..32e76c4214 100644 --- a/src/mbgl/util/tile_cover.cpp +++ b/src/mbgl/util/tile_cover.cpp @@ -181,6 +181,9 @@ std::vector tileCoverWithLOD(const TransformState& state, int32 const auto offset = state.getCenterOffset(); constexpr double zoomDiff = 1.0; + // Explanation on 0.55: mathematically, it is 0.5 used in calculation of + // the next LOD. 0.55 is chosen to avoid using LOD for less than 60 degrees + // pitch. constexpr double coefLOD[] = { 0.55 * zoomDiff / (zoomDiff + 1), 0.55 * (zoomDiff + 1) / (zoomDiff + 2), diff --git a/test/util/tile_cover.test.cpp b/test/util/tile_cover.test.cpp index e35e6e2e99..1bafc8b4ec 100644 --- a/test/util/tile_cover.test.cpp +++ b/test/util/tile_cover.test.cpp @@ -78,6 +78,35 @@ TEST(TileCover, PitchWithLargerResultSet) { }), (std::vector { cover.begin(), cover.begin() + 16}) ); } +TEST(TileCover, TileCoverLODCoversSingleLevelTileCover) { + Transform transform; + transform.resize({ 512, 768 }); + + std::vector padding = { EdgeInsets { 0, 100, 0, 0 }, EdgeInsets { 800, 0, 0, 0 } }; + std::vector zoom = { 14, 22 }; + std::vector bearing = { 2, 45, -22.5 }; + std::vector pitch = { 0, 30, 90 }; + + for (auto pad : padding) { + for (auto z : zoom) { + for (auto bear : bearing) { + for (auto p : pitch) { + transform.jumpTo(CameraOptions().withCenter(LatLng { 0.1, -0.1 }) + .withPadding(pad).withZoom(z).withBearing(bear).withPitch(p)); + auto singleLevelCover = util::tileCover(transform.getState(), z); + auto lodTileCover = util::tileCoverWithLOD(transform.getState(), z, z / 10 * 10); + for (auto tile: singleLevelCover) { + EXPECT_NE(lodTileCover.cend(), std::find_if(lodTileCover.cbegin(), lodTileCover.cend(), + [&tile] (auto parent) { return tile == parent || tile.isChildOf(parent); })) << "for padding: [" + << pad.top() << ", " << pad.left() << ", 0, 0] zoom:" << z << " bearing:" + << bear << " and pitch:" << p; + } + } + } + } + } +} + TEST(TileCover, WorldZ1) { EXPECT_EQ((std::vector{ { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 }, -- cgit v1.2.1