X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/a58aaed47ff23aa3e607fd2d9583d3345ae6453a..f5f53833288f037fee5e21a39b4d6ddf005994db:/src/coords.c?ds=inline diff --git a/src/coords.c b/src/coords.c index 03f8fdf3..25eb900c 100644 --- a/src/coords.c +++ b/src/coords.c @@ -35,10 +35,19 @@ renaming functions and defining LatLon and UTM structs. ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ** SUCH DAMAGE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_STDLIB_H #include +#endif +#ifdef HAVE_STRING_H #include +#endif +#ifdef HAVE_MATH_H #include +#endif #include "viking.h" #include "globals.h" @@ -54,19 +63,9 @@ renaming functions and defining LatLon and UTM structs. */ char *a_coords_dtostr ( double d ) { - /* In order to ignore locale, we do all the stuff manually */ - double integer, decimal; - integer = trunc(d); - - /* 6 decimals are sufficient (~0,1m) */ - /* Cf. http://www.tbs-sct.gc.ca/rpm-gbi/guides/Latlong_f.asp */ - decimal = d - integer; - decimal = decimal * 1000000; - decimal = trunc ( decimal ); - decimal = fabs ( decimal ); - - /* Format */ - return g_strdup_printf ( "%g.%06g", integer, decimal ); + gchar *buffer = g_malloc(G_ASCII_DTOSTR_BUF_SIZE*sizeof(gchar)); + g_ascii_dtostr (buffer, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) d); + return buffer; } #define PIOVER180 0.01745329252 @@ -99,11 +98,14 @@ double a_coords_utm_diff( const struct UTM *utm1, const struct UTM *utm2 ) double a_coords_latlon_diff ( const struct LatLon *ll1, const struct LatLon *ll2 ) { static struct LatLon tmp1, tmp2; + gdouble tmp3; tmp1.lat = ll1->lat * PIOVER180; tmp1.lon = ll1->lon * PIOVER180; tmp2.lat = ll2->lat * PIOVER180; tmp2.lon = ll2->lon * PIOVER180; - return EquatorialRadius * acos(sin(tmp1.lat)*sin(tmp2.lat)+cos(tmp1.lat)*cos(tmp2.lat)*cos(tmp1.lon-tmp2.lon)); + tmp3 = EquatorialRadius * acos(sin(tmp1.lat)*sin(tmp2.lat)+cos(tmp1.lat)*cos(tmp2.lat)*cos(tmp1.lon-tmp2.lon)); + // For very small differences we can sometimes get NaN returned + return isnan(tmp3)?0:tmp3; } void a_coords_latlon_to_utm( const struct LatLon *latlon, struct UTM *utm )