From db60275e9c69b1ec768591df876f69e3b445c23a Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Thu, 21 Dec 2017 14:02:42 -0800 Subject: [core] Wrapped LatLng should be inclusive of min and max longitude. --- include/mbgl/util/geo.hpp | 10 ++++++++-- platform/darwin/src/MGLMapSnapshotter.mm | 1 + src/mbgl/map/transform.cpp | 1 + test/util/geo.test.cpp | 4 ++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/mbgl/util/geo.hpp b/include/mbgl/util/geo.hpp index 60043ee156..cccbac3afb 100644 --- a/include/mbgl/util/geo.hpp +++ b/include/mbgl/util/geo.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include @@ -53,8 +52,15 @@ public: LatLng wrapped() const { return { lat, lon, Wrapped }; } + double wrap (double value, double min, double max) { + const double d = max - min; + const double f = std::fmod(value - min, d); + const double s = std::fmod(f + d, d); + return value >= max && s == 0 ? max : s + min; + } + void wrap() { - lon = util::wrap(lon, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); + lon = wrap(lon, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); } // If the distance from start to end longitudes is between half and full diff --git a/platform/darwin/src/MGLMapSnapshotter.mm b/platform/darwin/src/MGLMapSnapshotter.mm index 346666cf80..df889ee230 100644 --- a/platform/darwin/src/MGLMapSnapshotter.mm +++ b/platform/darwin/src/MGLMapSnapshotter.mm @@ -9,6 +9,7 @@ #import #import #import +#import #import "MGLOfflineStorage_Private.h" #import "MGLGeometry_Private.h" diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 105adf0400..78693eabac 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/test/util/geo.test.cpp b/test/util/geo.test.cpp index 6832ba3486..af8e815670 100644 --- a/test/util/geo.test.cpp +++ b/test/util/geo.test.cpp @@ -170,6 +170,10 @@ TEST(LatLng, Boundaries) { coordinate.wrap(); ASSERT_DOUBLE_EQ(179.90000000000001, coordinate.longitude()); // 1E-14 + coordinate = LatLng(0, 180); + coordinate.wrap(); + ASSERT_DOUBLE_EQ(180.0, coordinate.longitude()); + coordinate = LatLng(0, 180.9); coordinate.wrap(); ASSERT_DOUBLE_EQ(-179.09999999999999, coordinate.longitude()); -- cgit v1.2.1