mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 06:15:26 +00:00
Bugfix for algorithm in get_distance()
Fixed bug in the Haversine function in get_distance() based on algorithm at https://www.movable-type.co.uk/scripts/latlong.html and added bounds to the 'a' term to avoid floating point errors for antipodal points. Signed-off-by: Doug Junkins <junkins@foghead.com>
This commit is contained in:
parent
154792ffd1
commit
14a763a6a0
2 changed files with 6 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
|||
- Core: fix bug in get_distance() to correctly compute spherical distance
|
||||
- Desktop: For videos, add save data export as subtitle file
|
||||
- Desktop: make dive sites 1st class citizens with their own dive site table
|
||||
- Desktop: only show dives at the dive sites selected in dive site table
|
||||
|
|
|
@ -77,15 +77,18 @@ struct dive_site *get_dive_site_by_gps_and_name(char *name, const location_t *lo
|
|||
// Calculate the distance in meters between two coordinates.
|
||||
unsigned int get_distance(const location_t *loc1, const location_t *loc2)
|
||||
{
|
||||
double lat1_r = udeg_to_radians(loc1->lat.udeg);
|
||||
double lat2_r = udeg_to_radians(loc2->lat.udeg);
|
||||
double lat_d_r = udeg_to_radians(loc2->lat.udeg - loc1->lat.udeg);
|
||||
double lon_d_r = udeg_to_radians(loc2->lon.udeg - loc1->lon.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);
|
||||
cos(lat1_r) * cos(lat2_r) * sin(lon_d_r/2) * sin(lon_d_r/2);
|
||||
if (a < 0.0) a = 0.0;
|
||||
if (a > 1.0) a = 1.0;
|
||||
double c = 2 * atan2(sqrt(a), sqrt(1.0 - a));
|
||||
|
||||
// Earth radious in metres
|
||||
// Earth radius in metres
|
||||
return lrint(6371000 * c);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue