** 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 <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
#include <string.h>
+#endif
+#ifdef HAVE_MATH_H
#include <math.h>
+#endif
#include "viking.h"
#include "globals.h"
*/
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
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 )