aboutsummaryrefslogblamecommitdiffstats
path: root/libtellurian_distance.c
blob: dec0edd01095b8dc549d69d5463deed0ea1ae479 (plain) (tree)
1
2
3

                                                         
            


















                                                                                                                    


     











































                                                                                  
      
/* See LICENSE file for copyright and license details. */
#include "common.h"
#ifndef TEST


double
libtellurian_distance(double latitude1, double longitude1,
                      double latitude2, double longitude2,
                      double *azimuth1_out, double *azimuth2_out)
{
	double r;
	latitude1 = radians(latitude1);
	longitude1 = radians(longitude1);
	latitude2 = radians(latitude2);
	longitude2 = radians(longitude2);
	r = libtellurian_distance_radians(latitude1, longitude1, latitude2, longitude2, azimuth1_out, azimuth2_out);
	if (azimuth1_out)
		*azimuth1_out = degrees(*azimuth1_out);
	if (azimuth2_out)
		*azimuth2_out = degrees(*azimuth2_out);
	return r;
}


#else


static int
check(double da, double db, double dc, double dd,
      double ra, double rb, double rc, double rd)
{
	double az1_ref = 1, az2_ref = 2, az1 = 3, az2 = 4, az1b = 5, az2b = 6;
	double s_ref, s1, s2, s3, s4;

	s_ref = libtellurian_distance_radians(ra, rb, rc, rd, &az1_ref, &az2_ref);
	az1_ref *= 180 / M_PI;
	az2_ref *= 180 / M_PI;

	s1 = libtellurian_distance(da, db, dc, dd, &az1, &az2);
	s2 = libtellurian_distance(da, db, dc, dd, &az1b, NULL);
	s3 = libtellurian_distance(da, db, dc, dd, NULL, &az2b);
	s4 = libtellurian_distance(da, db, dc, dd, NULL, NULL);
	ASSERT(s1 == s_ref);
	ASSERT(s2 == s_ref);
	ASSERT(s3 == s_ref);
	ASSERT(s4 == s_ref);
	return az1 == az1_ref && az2 == az2_ref && az1 == az1b && az2 == az2b;
}

int
main(void)
{
	double a1 = 1, a2 = 2, s;

	ASSERT(check(30, 45, 60, 90,  D30, D45, D60, D90));
	ASSERT(check(30, 45, 60, 45,  D30, D45, D60, D45));
	ASSERT(check(45, 30, 60, 45,  D45, D30, D60, D45));
	ASSERT(check(45, 30, 30, 45,  D45, D30, D30, D45));

	s = libtellurian_distance(0, 0, 0, 90, &a1, &a2);
	fprintf(stderr, "%lg\n", s);
	fprintf(stderr, "%lg\n", s / LIBTELLURIAN_MERIDIONAL_CIRCUMFERENCE);
	(void) s;
	ASSERT(a1 == a2);
	ASSERT(a1 == 90);
	return 0;
}


#endif