From 5042f54a13899242fa508be7c6531b479236bfc3 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Tue, 24 Aug 2021 12:16:47 +0200 Subject: QGeoCoordinateAnimation: fix shortest path interpolation Inspired by CodeChecker warning about dead code. Fix some copy-paste issues which could lead to incorrect shortest path estimation when it crosses the -180/180 degree line. As a drive-by: remove the unneeded initialization of a variable, that is anyway initialized later. Just to silence another CodeChecker warning. Pick-to: 6.2 Change-Id: I9ebd5900a5ca331ef5846a06cf6415a2f1093400 Reviewed-by: Alex Blasche --- src/positioning/qwebmercator.cpp | 2 +- .../qquickgeocoordinateanimation.cpp | 2 +- .../tst_coordinate.qml | 44 ++++++++++++++++++++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/positioning/qwebmercator.cpp b/src/positioning/qwebmercator.cpp index 0aad4100..55b2e600 100644 --- a/src/positioning/qwebmercator.cpp +++ b/src/positioning/qwebmercator.cpp @@ -105,7 +105,7 @@ QGeoCoordinate QWebMercator::coordinateInterpolation(const QGeoCoordinate &from, QDoubleVector2D s = QWebMercator::coordToMercator(from); QDoubleVector2D e = QWebMercator::coordToMercator(to); - double x = s.x(); + double x; if (0.5 < qAbs(e.x() - s.x())) { // handle dateline crossing diff --git a/src/positioningquick/qquickgeocoordinateanimation.cpp b/src/positioningquick/qquickgeocoordinateanimation.cpp index b5d1286c..3f5cef8d 100644 --- a/src/positioningquick/qquickgeocoordinateanimation.cpp +++ b/src/positioningquick/qquickgeocoordinateanimation.cpp @@ -105,7 +105,7 @@ QVariant q_coordinateShortestInterpolator(const QGeoCoordinate &from, const QGeo else if (sx < ex) ex -= 1.0; - x = fromX + (toX - fromX) * progress; + x = sx + (ex - sx) * progress; if (x < 0.0) x += 1.0; diff --git a/tests/auto/declarative_positioning_core/tst_coordinate.qml b/tests/auto/declarative_positioning_core/tst_coordinate.qml index 4b34f7a6..eb5a2573 100644 --- a/tests/auto/declarative_positioning_core/tst_coordinate.qml +++ b/tests/auto/declarative_positioning_core/tst_coordinate.qml @@ -322,12 +322,48 @@ Item { } } - function test_default_coordinate_animation() + function test_default_coordinate_animation(data) { //shortest - coordinate_animation(QtPositioning.coordinate(58.0,12.0), - QtPositioning.coordinate(62.0,24.0), - true) + coordinate_animation(data.from, data.to, data.east) + } + + function test_default_coordinate_animation_data() + { + return [ + { + from: QtPositioning.coordinate(58.0, 12.0), + to: QtPositioning.coordinate(62.0, 24.0), + east: true + }, + { + from: QtPositioning.coordinate(58.0, 24.0), + to: QtPositioning.coordinate(42.0, 12.0), + east: false + }, + // cross 0 + { + from: QtPositioning.coordinate(30, 10), + to: QtPositioning.coordinate(20, -10), + east: false + }, + { + from: QtPositioning.coordinate(30, -20), + to: QtPositioning.coordinate(20, 10), + east: true + }, + // cross 180 + { + from: QtPositioning.coordinate(30, 170), + to: QtPositioning.coordinate(30, -170), + east: true + }, + { + from: QtPositioning.coordinate(30, -170), + to: QtPositioning.coordinate(30, 170), + east: false + }, + ] } function test_east_direction_coordinate_animation(data) -- cgit v1.2.3