From 7a594e3ec5e66f30a1604d492f3bb1af1259afd7 Mon Sep 17 00:00:00 2001 From: Anton Lundin Date: Sat, 13 Jun 2015 11:54:33 +0200 Subject: [PATCH] Simplify distance calculations This simplifies the distance calculations and removes a dependency. This version uses propper math instead of my to simple previous version. Signed-off-by: Anton Lundin Signed-off-by: Dirk Hohndel --- CMakeLists.txt | 4 ++-- divesite.c | 23 +++++++++++++++++++---- qt-ui/globe.cpp | 8 -------- units.h | 5 +++++ 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0125b89bf..f5322b8e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,8 +132,8 @@ if(NOT (insource OR insourcedir)) endif() # configure Qt. -find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network WebKitWidgets PrintSupport Svg Test LinguistTools Positioning) -set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg Qt5::Positioning) +find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network WebKitWidgets PrintSupport Svg Test LinguistTools) +set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg) set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test) # Generate the ssrf-config.h every 'make' diff --git a/divesite.c b/divesite.c index 3caa7b3ba..e096c7172 100644 --- a/divesite.c +++ b/divesite.c @@ -2,6 +2,8 @@ #include "divesite.h" #include "dive.h" +#include + struct dive_site_table dive_site_table; /* there could be multiple sites of the same name - return the first one */ @@ -34,8 +36,21 @@ uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, stru return 0; } -/* this is in globe.cpp, so including the .h file is a pain */ -extern double getDistance(int lat1, int lon1, int lat2, int lon2); +// Calculate the distance in meters between two coordinates. +static unsigned int get_distance(degrees_t lat1, degrees_t lon1, degrees_t lat2, degrees_t lon2) +{ + double lat1_r = udeg_to_radians(lat1.udeg); + double lat2_r = udeg_to_radians(lat2.udeg); + double lat_d_r = udeg_to_radians(lat2.udeg-lat1.udeg); + double lon_d_r = udeg_to_radians(lon2.udeg-lon1.udeg); + + double a = sin(lat_d_r/2) * sin(lat_d_r/2) + + cos(lat2_r) * cos(lat2_r) * sin(lon_d_r/2) * sin(lon_d_r/2); + double c = 2 * atan2(sqrt(a), sqrt(1.0 - a)); + + // Earth radious in metres + return 6371000 * c; +} /* find the closest one, no more than distance meters away - if more than one at same distance, pick the first */ uint32_t get_dive_site_uuid_by_gps_proximity(degrees_t latitude, degrees_t longitude, int distance, struct dive_site **dsp) @@ -43,10 +58,10 @@ uint32_t get_dive_site_uuid_by_gps_proximity(degrees_t latitude, degrees_t longi int i; int uuid = 0; struct dive_site *ds; - double cur_distance, min_distance = distance + 0.001; + unsigned int cur_distance, min_distance = distance; for_each_dive_site (i, ds) { if (dive_site_has_gps_location(ds) && - (cur_distance = getDistance(ds->latitude.udeg, ds->longitude.udeg, latitude.udeg, longitude.udeg)) < min_distance) { + (cur_distance = get_distance(ds->latitude, ds->longitude, latitude, longitude)) < min_distance) { min_distance = cur_distance; uuid = ds->uuid; if (dsp) diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index 76d48b7ba..b8e0ec87e 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -1,5 +1,4 @@ #include "globe.h" -#include #ifndef NO_MARBLE #include "mainwindow.h" #include "helpers.h" @@ -393,10 +392,3 @@ void GlobeGPS::reload() { } #endif - -extern "C" double getDistance(int lat1, int lon1, int lat2, int lon2) -{ - QGeoCoordinate c1(lat1 / 1000000.0, lon1 / 1000000.0); - QGeoCoordinate c2(lat2 / 1000000.0, lon2 / 1000000.0); - return c1.distanceTo(c2); -} diff --git a/units.h b/units.h index 90d7949b0..0baf2ffa5 100644 --- a/units.h +++ b/units.h @@ -119,6 +119,11 @@ typedef struct int udeg; } degrees_t; +static inline double udeg_to_radians(int udeg) +{ + return (udeg * M_PI) / (1000000.0 * 180.0); +} + static inline double grams_to_lbs(int grams) { return grams / 453.6;