diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2015-04-20 12:01:46 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2015-04-20 12:01:46 +0200 |
commit | 2831073f85b502ed0b00c3fb335fadfd705524a5 (patch) | |
tree | 695ad03668a87e69b54688843aefe34a8ee4db60 | |
parent | 219737ffa656dd71a69b7d54d9c50f8f8ce20298 (diff) | |
parent | 8b44cfeb7642c74307c4c946fded280fe7e7bbad (diff) | |
download | qtlocation-mapboxgl-2831073f85b502ed0b00c3fb335fadfd705524a5.tar.gz |
Merge pull request #1295 from mapbox/1199-whee
Ensure correct spin direction
-rw-r--r-- | include/mbgl/util/math.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/map/transform.cpp | 22 |
2 files changed, 22 insertions, 6 deletions
diff --git a/include/mbgl/util/math.hpp b/include/mbgl/util/math.hpp index e800fc7847..647fa5e67f 100644 --- a/include/mbgl/util/math.hpp +++ b/include/mbgl/util/math.hpp @@ -99,6 +99,12 @@ T clamp(T value, T min, T max) { } template <typename T> +T wrap(T value, T min, T max) { + T d = max - min; + return value == max ? value : std::fmod((std::fmod((value - min), d) + d), d) + min; +} + +template <typename T> T smoothstep(T edge0, T edge1, T x) { T t = clamp((x - edge0) / (edge1 - edge0), T(0), T(1)); return t * t * (T(3) - T(2) * t); diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 10f69e2edc..cb73915e36 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -12,6 +12,21 @@ using namespace mbgl; +/** Converts the given angle (in radians) to be numerically close to the anchor angle, allowing it to be interpolated properly without sudden jumps. */ +static double _normalizeAngle(double angle, double anchorAngle) +{ + angle = util::wrap(angle, -M_PI, M_PI); + double diff = std::abs(angle - anchorAngle); + if (std::abs(angle - util::M2PI - anchorAngle) < diff) { + angle -= util::M2PI; + } + if (std::abs(angle + util::M2PI - anchorAngle) < diff) { + angle += util::M2PI; + } + + return angle; +} + Transform::Transform(View &view_) : view(view_) { @@ -330,12 +345,7 @@ void Transform::_setAngle(double new_angle, const Duration duration) { MapChangeRegionWillChangeAnimated : MapChangeRegionWillChange); - while (new_angle > M_PI) - new_angle -= util::M2PI; - while (new_angle <= -M_PI) - new_angle += util::M2PI; - - final.angle = new_angle; + final.angle = _normalizeAngle(new_angle, current.angle); if (duration == Duration::zero()) { current.angle = final.angle; |