/* See LICENSE file for copyright and license details. */ #include "common.h" #ifndef TEST void libtellurian_end_point(double latitude1, double longitude1, double azimuth1, double distance, double *latitude2_out, double *longitude2_out, double *azimuth2_out) { latitude1 = radians(latitude1); longitude1 = radians(longitude1); azimuth1 = radians(azimuth1); libtellurian_end_point_radians(latitude1, longitude1, azimuth1, distance, latitude2_out, longitude2_out, azimuth2_out); if (latitude2_out) *latitude2_out = degrees(*latitude2_out); if (longitude2_out) *longitude2_out = degrees(*longitude2_out); if (azimuth2_out) *azimuth2_out = degrees(*azimuth2_out); } #else # define PM LIBTELLURIAN_MERIDIONAL_CIRCUMFERENCE # define PE LIBTELLURIAN_EQUATORIAL_CIRCUMFERENCE static int check(double dlat, double dlon, double daz, double rlat, double rlon, double raz, double s) { double lat1, lat2, lon1, lon2, az1, az2; libtellurian_end_point_radians(rlat, rlon, raz, s, &lat1, &lon1, &az1); lat1 *= 180 / M_PI; lon1 *= 180 / M_PI; az1 *= 180 / M_PI; libtellurian_end_point(dlat, dlon, daz, s, &lat2, &lon2, &az2); if (lat2 != lat1 || lon2 != lon1 || az2 != az1) return 0; libtellurian_end_point(dlat, dlon, daz, s, &lat2, NULL, NULL); libtellurian_end_point(dlat, dlon, daz, s, NULL, &lon2, NULL); libtellurian_end_point(dlat, dlon, daz, s, NULL, NULL, &az2); if (lat2 != lat1 || lon2 != lon1 || az2 != az1) return 0; libtellurian_end_point(dlat, dlon, daz, s, NULL, &lon2, &az2); if (lon2 != lon1 || az2 != az1) return 0; libtellurian_end_point(dlat, dlon, daz, s, &lat2, NULL, &az2); if (lat2 != lat1 || az2 != az1) return 0; libtellurian_end_point(dlat, dlon, daz, s, &lat2, &lon2, NULL); if (lat2 != lat1 || lon2 != lon1) return 0; libtellurian_end_point(dlat, dlon, daz, s, NULL, NULL, NULL); return 1; } int main(void) { ASSERT(check(0, 0, 0, 0, 0, 0, 0)); ASSERT(check(0, 0, 0, 0, 0, 0, PM / 4)); ASSERT(check(0, 0, 0, 0, 0, 0, PM / 2)); ASSERT(check(0, 0, 0, 0, 0, 0, PM)); ASSERT(check(0, 0, 0, 0, 0, 0, 2 * PM)); ASSERT(check(0, 0, 0, 0, 0, 0, 3 * PM / 2)); ASSERT(check(0, 0, 90, 0, 0, D90, PE)); ASSERT(check(0, 0, 90, 0, 0, D90, PE / 8)); ASSERT(check(0, 0, 90, 0, 0, D90, PE / 4)); ASSERT(check(0, 0, 90, 0, 0, D90, PE / 2)); ASSERT(check(0, 0, 0, 0, 0, 0, 1000.0)); ASSERT(check(0, 0, 30, 0, 0, D30, 1000.0)); ASSERT(check(0, 0, 45, 0, 0, D45, 1000.0)); ASSERT(check(0, 0, 60, 0, 0, D60, 1000.0)); ASSERT(check(0, 0, 90, 0, 0, D90, 1000.0)); ASSERT(check(0, 0, 180, 0, 0, D180, 1000.0)); ASSERT(check(0, 30, 0, 0, D30, 0, 1000.0)); ASSERT(check(0, 45, 30, 0, D45, D30, 1000.0)); ASSERT(check(0, 60, 45, 0, D60, D45, 1000.0)); ASSERT(check(0, 90, 60, 0, D90, D60, 1000.0)); ASSERT(check(0, 180, 90, 0, D180, D90, 1000.0)); ASSERT(check(0, 45, 180, 0, D45, D180, 1000.0)); ASSERT(check(45, 30, 0, D45, D30, 0, 1000.0)); ASSERT(check(60, 45, 30, D60, D45, D30, 1000.0)); ASSERT(check(90, 60, 45, D90, D60, D45, 1000.0)); ASSERT(check(-45, 90, 60, -D45, D90, D60, 1000.0)); ASSERT(check(-60, 180, 90, -D60, D180, D90, 1000.0)); ASSERT(check(-90, 45, 180, -D90, D45, D180, 1000.0)); return 0; } #endif