mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
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 <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
9ec155fad0
commit
7a594e3ec5
4 changed files with 26 additions and 14 deletions
|
@ -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'
|
||||
|
|
23
divesite.c
23
divesite.c
|
@ -2,6 +2,8 @@
|
|||
#include "divesite.h"
|
||||
#include "dive.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
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)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "globe.h"
|
||||
#include <QGeoCoordinate>
|
||||
#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);
|
||||
}
|
||||
|
|
5
units.h
5
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;
|
||||
|
|
Loading…
Reference in a new issue