summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-04-20 12:01:46 +0200
committerKonstantin Käfer <mail@kkaefer.com>2015-04-20 12:01:46 +0200
commit2831073f85b502ed0b00c3fb335fadfd705524a5 (patch)
tree695ad03668a87e69b54688843aefe34a8ee4db60
parent219737ffa656dd71a69b7d54d9c50f8f8ce20298 (diff)
parent8b44cfeb7642c74307c4c946fded280fe7e7bbad (diff)
downloadqtlocation-mapboxgl-2831073f85b502ed0b00c3fb335fadfd705524a5.tar.gz
Merge pull request #1295 from mapbox/1199-whee
Ensure correct spin direction
-rw-r--r--include/mbgl/util/math.hpp6
-rw-r--r--src/mbgl/map/transform.cpp22
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;