summaryrefslogtreecommitdiff
path: root/src/positioning
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2017-01-12 18:02:45 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2017-02-27 17:04:47 +0000
commit11e6a62957433843816b41ad11fada7ca8eab85c (patch)
tree22baca117d83825ef1596cb7abb9874309fda2c0 /src/positioning
parent7692448da626e803a05344e6ef31ecac9cc5b460 (diff)
downloadqtlocation-11e6a62957433843816b41ad11fada7ca8eab85c.tar.gz
Use qRadiansToDegrees() and qDegreesToRadians() more widely
They document intent more clearly (and replace *two* local hand-rolled versions of each). Also kill an extraneous #include of <math.h>; and switch to qmath.h as source for M_PI, replacing the M_PID value (and friends) previously provided by (thankfully private) qlocationutils_p.h (at more precision than even long double would retain - qmath.h's M_PI is entirely sufficient even for long double, as is the Linux <math.h> one). Task-number: QTBUG-58083 Change-Id: I6fa4abd3c8ed9c826998f2cdc2aefc51681c19c1 Reviewed-by: Paolo Angelelli <paolo.angelelli@qt.io>
Diffstat (limited to 'src/positioning')
-rw-r--r--src/positioning/qdoublematrix4x4.cpp6
-rw-r--r--src/positioning/qgeocoordinate.cpp42
-rw-r--r--src/positioning/qlocationutils_p.h14
-rw-r--r--src/positioning/qwebmercator.cpp5
-rw-r--r--src/positioning/qwebmercator_p.h1
5 files changed, 24 insertions, 44 deletions
diff --git a/src/positioning/qdoublematrix4x4.cpp b/src/positioning/qdoublematrix4x4.cpp
index bca38075..76e1252b 100644
--- a/src/positioning/qdoublematrix4x4.cpp
+++ b/src/positioning/qdoublematrix4x4.cpp
@@ -508,7 +508,7 @@ void QDoubleMatrix4x4::rotate(double angle, double x, double y, double z)
s = 0.0;
c = -1.0;
} else {
- double a = angle * M_PI / 180.0;
+ double a = qDegreesToRadians(angle);
c = std::cos(a);
s = std::sin(a);
}
@@ -614,7 +614,7 @@ void QDoubleMatrix4x4::projectedRotate(double angle, double x, double y, double
s = 0.0;
c = -1.0;
} else {
- double a = angle * M_PI / 180.0;
+ double a = qDegreesToRadians(angle);
c = std::cos(a);
s = std::sin(a);
}
@@ -778,7 +778,7 @@ void QDoubleMatrix4x4::perspective(double verticalAngle, double aspectRatio, dou
// Construct the projection.
QDoubleMatrix4x4 m(1);
- double radians = (verticalAngle / 2.0) * M_PI / 180.0;
+ double radians = qDegreesToRadians(verticalAngle / 2.0);
double sine = std::sin(radians);
if (sine == 0.0)
return;
diff --git a/src/positioning/qgeocoordinate.cpp b/src/positioning/qgeocoordinate.cpp
index 8d39a62e..b0d9fc0f 100644
--- a/src/positioning/qgeocoordinate.cpp
+++ b/src/positioning/qgeocoordinate.cpp
@@ -45,26 +45,12 @@
#include <QDataStream>
#include <QDebug>
#include <qnumeric.h>
-
-#include <math.h>
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
+#include <qmath.h>
QT_BEGIN_NAMESPACE
static const double qgeocoordinate_EARTH_MEAN_RADIUS = 6371.0072;
-inline static double qgeocoordinate_degToRad(double deg)
-{
- return deg * M_PI / 180;
-}
-inline static double qgeocoordinate_radToDeg(double rad)
-{
- return rad * 180 / M_PI;
-}
-
QGeoCoordinatePrivate::QGeoCoordinatePrivate():
lat(qQNaN()),
@@ -430,15 +416,15 @@ qreal QGeoCoordinate::distanceTo(const QGeoCoordinate &other) const
}
// Haversine formula
- double dlat = qgeocoordinate_degToRad(other.d->lat - d->lat);
- double dlon = qgeocoordinate_degToRad(other.d->lng - d->lng);
+ double dlat = qDegreesToRadians(other.d->lat - d->lat);
+ double dlon = qDegreesToRadians(other.d->lng - d->lng);
double haversine_dlat = sin(dlat / 2.0);
haversine_dlat *= haversine_dlat;
double haversine_dlon = sin(dlon / 2.0);
haversine_dlon *= haversine_dlon;
double y = haversine_dlat
- + cos(qgeocoordinate_degToRad(d->lat))
- * cos(qgeocoordinate_degToRad(other.d->lat))
+ + cos(qDegreesToRadians(d->lat))
+ * cos(qDegreesToRadians(other.d->lat))
* haversine_dlon;
double x = 2 * asin(sqrt(y));
return qreal(x * qgeocoordinate_EARTH_MEAN_RADIUS * 1000);
@@ -462,14 +448,14 @@ qreal QGeoCoordinate::azimuthTo(const QGeoCoordinate &other) const
return 0;
}
- double dlon = qgeocoordinate_degToRad(other.d->lng - d->lng);
- double lat1Rad = qgeocoordinate_degToRad(d->lat);
- double lat2Rad = qgeocoordinate_degToRad(other.d->lat);
+ double dlon = qDegreesToRadians(other.d->lng - d->lng);
+ double lat1Rad = qDegreesToRadians(d->lat);
+ double lat2Rad = qDegreesToRadians(other.d->lat);
double y = sin(dlon) * cos(lat2Rad);
double x = cos(lat1Rad) * sin(lat2Rad) - sin(lat1Rad) * cos(lat2Rad) * cos(dlon);
- double azimuth = qgeocoordinate_radToDeg(atan2(y, x)) + 360.0;
+ double azimuth = qRadiansToDegrees(atan2(y, x)) + 360.0;
double whole;
double fraction = modf(azimuth, &whole);
return qreal((int(whole + 360) % 360) + fraction);
@@ -479,12 +465,12 @@ void QGeoCoordinatePrivate::atDistanceAndAzimuth(const QGeoCoordinate &coord,
qreal distance, qreal azimuth,
double *lon, double *lat)
{
- double latRad = qgeocoordinate_degToRad(coord.d->lat);
- double lonRad = qgeocoordinate_degToRad(coord.d->lng);
+ double latRad = qDegreesToRadians(coord.d->lat);
+ double lonRad = qDegreesToRadians(coord.d->lng);
double cosLatRad = cos(latRad);
double sinLatRad = sin(latRad);
- double azimuthRad = qgeocoordinate_degToRad(azimuth);
+ double azimuthRad = qDegreesToRadians(azimuth);
double ratio = (distance / (qgeocoordinate_EARTH_MEAN_RADIUS * 1000.0));
double cosRatio = cos(ratio);
@@ -495,8 +481,8 @@ void QGeoCoordinatePrivate::atDistanceAndAzimuth(const QGeoCoordinate &coord,
double resultLonRad = lonRad + atan2(sin(azimuthRad) * sinRatio * cosLatRad,
cosRatio - sinLatRad * sin(resultLatRad));
- *lat = qgeocoordinate_radToDeg(resultLatRad);
- *lon = qgeocoordinate_radToDeg(resultLonRad);
+ *lat = qRadiansToDegrees(resultLatRad);
+ *lon = qRadiansToDegrees(resultLonRad);
}
/*!
diff --git a/src/positioning/qlocationutils_p.h b/src/positioning/qlocationutils_p.h
index f66179e1..75c4b7f4 100644
--- a/src/positioning/qlocationutils_p.h
+++ b/src/positioning/qlocationutils_p.h
@@ -51,14 +51,10 @@
//
#include <QtCore/QtGlobal>
-#include <math.h>
+#include <math.h> // needed for non-std:: versions of functions
+#include <qmath.h>
#include <QtPositioning/QGeoCoordinate>
-static const double M_PID = 3.14159265358979323846264338327950288; // to get more precision than float
-static const double M_1_180D = 0.0055555555555555555555555555555555555555556;
-static const double M_1_PID = 1.0 / M_PID;
-static const double M_PI_180D = M_PID / 180.0; //0.0174532925199432954743716805978692718781530857086181640625;
-static const double M_180_PID = 180.0 / M_PID; // 57.29577951308232286464772187173366546630859375
static const double offsetEpsilon = 0.0000000000001;
static const double leftOffset = -180.0 + offsetEpsilon;
static const double rightOffset = 180.0 - offsetEpsilon;
@@ -209,12 +205,12 @@ public:
inline static double radians(double degrees)
{
- return degrees * M_PI_180D;
+ return qDegreesToRadians(degrees);
}
inline static double degrees(double radians)
{
- return radians * M_180_PID;
+ return qRadiansToDegrees(radians);
}
inline static double earthMeanRadius()
@@ -224,7 +220,7 @@ public:
inline static double earthMeanDiameter()
{
- return earthMeanRadius() * 2.0 * M_PID;
+ return earthMeanRadius() * 2.0 * M_PI;
}
inline static double mercatorMaxLatitude()
diff --git a/src/positioning/qwebmercator.cpp b/src/positioning/qwebmercator.cpp
index da35c7d7..b8abac2b 100644
--- a/src/positioning/qwebmercator.cpp
+++ b/src/positioning/qwebmercator.cpp
@@ -41,8 +41,7 @@
#include "qgeocoordinate.h"
#include <qnumeric.h>
-
-#include <cmath>
+#include <qmath.h>
#include "qdoublevector2d_p.h"
#include "qdoublevector3d_p.h"
@@ -111,7 +110,7 @@ QGeoCoordinate QWebMercator::mercatorToCoordClamped(const QDoubleVector2D &merca
else if (fy > 1.0)
fy = 1.0;
- double lat = (180.0 / M_PI) * (2.0 * std::atan(std::exp(M_PI * (1.0 - 2.0 * fy))) - (M_PI / 2.0));
+ double lat = qRadiansToDegrees(2.0 * std::atan(std::exp(M_PI * (1.0 - 2.0 * fy))) - (M_PI / 2.0));
double lng;
if (fx >= 0) {
diff --git a/src/positioning/qwebmercator_p.h b/src/positioning/qwebmercator_p.h
index 2b8e9564..52a5e040 100644
--- a/src/positioning/qwebmercator_p.h
+++ b/src/positioning/qwebmercator_p.h
@@ -52,7 +52,6 @@
#include <qglobal.h>
#include <QtCore/qvariant.h>
-#include <math.h>
#include "qpositioningglobal_p.h"
QT_BEGIN_NAMESPACE