#include "test_cxc.h"
static void test_loncxlonc(double lon_a, double lat_a, double lon_b, double lat_b,
double lon_c, double lat_c, double lon_d, double lat_d,
double lon_ref_p, double lat_ref_p,
double lon_ref_q, double lat_ref_q, int ref_ret_val);
int const p_between_ab = 1 << 0;
int const q_between_ab = 1 << 1;
int const p_between_cd = 1 << 2;
int const q_between_cd = 1 << 3;
int const circles_are_identically = 1 << 4;
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-10, 5}, {-5, 10}};
test_loncxlonc(0, lat_coords[i][0],
0, lat_coords[i][1],
0, lat_coords[i^1][0],
0, lat_coords[i^1][1],
0, -5,
0, 5,
p_between_ab + p_between_cd + q_between_ab + q_between_cd +
circles_are_identically);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{20, 25}, {30, 10}};
test_loncxlonc(10, lat_coords[i][0],
10, lat_coords[i][1],
10, lat_coords[i^1][0],
10, lat_coords[i^1][1],
10, 20,
10, 25,
p_between_ab + p_between_cd + q_between_ab + q_between_cd +
circles_are_identically);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-80, -70}, {20, 30}};
test_loncxlonc(30, lat_coords[i][0],
30, lat_coords[i][1],
30, lat_coords[i^1][0],
30, lat_coords[i^1][1],
30, (lat_coords[i][0] +
lat_coords[i][1])*0.5,
30, (lat_coords[i^1][0] +
lat_coords[i^1][1])*0.5,
p_between_ab + q_between_cd +
circles_are_identically);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-80, -70}, {20, 30}};
test_loncxlonc(-30, lat_coords[i][0],
-30, lat_coords[i][1],
30, lat_coords[i^1][0],
30, lat_coords[i^1][1],
0, 90,
0, -90,
0);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{80, 85}, {70, 75}};
test_loncxlonc(-45 , lat_coords[i][0],
-45+180, lat_coords[i][1],
50 , lat_coords[i^1][0],
50 , lat_coords[i^1][1],
0 , 90,
0 , -90,
p_between_ab);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{90, 80}, {-40, -30}};
int ret_val[2] = {p_between_ab, p_between_cd};
test_loncxlonc(60, lat_coords[i][0],
60, lat_coords[i][1],
90, lat_coords[i^1][0],
90, lat_coords[i^1][1],
0, 90,
0, -90,
ret_val[i]);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{75, 80},{60, 85}};
test_loncxlonc(60 , lat_coords[i][0],
60-180, lat_coords[i][1],
90 , lat_coords[i^1][0],
90-180, lat_coords[i^1][1],
0 , 90,
0 , -90,
p_between_ab + p_between_cd);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-75, -80},{-60, -85}};
test_loncxlonc(60 , lat_coords[i][0],
60-180, lat_coords[i][1],
90 , lat_coords[i^1][0],
90-180, lat_coords[i^1][1],
0 , 90,
0 , -90,
q_between_ab + q_between_cd);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-75, -80},{-60, -90}};
test_loncxlonc(60 , lat_coords[i][0],
60-180, lat_coords[i][1],
90 , lat_coords[i^1][0],
90-180, lat_coords[i^1][1],
0 , 90,
0 , -90,
q_between_ab + q_between_cd);
}
test_loncxlonc( 0, -10,
0, 10,
10, 0,
10, 0,
-1, -1,
-1, -1,
-1);
test_loncxlonc(10, -10,
10, 10,
0, 0,
0, 0,
-1, -1,
-1, -1,
-1);
test_loncxlonc( 0, 10,
0, 10,
10, 0,
10, 0,
-1, -1,
-1, -1,
-1);
test_loncxlonc( 0, 0,
0, 0,
10, 10,
10, 10,
-1, -1,
-1, -1,
-1);
test_loncxlonc( 0, 10,
0, 10,
0, 0,
0, 0,
-1, -1,
-1, -1,
-1);
test_loncxlonc( 0, 0,
0, 0,
0, 0,
0, 0,
0, 0,
180, 0,
p_between_ab + p_between_cd);
for (int i = 0; i < 8; ++i) {
double lon_coords[2] = {0 , 90};
double lat_coords[2] = {-90, 90};
test_loncxlonc(lon_coords[i>>2], lat_coords[i&1],
lon_coords[i>>2], lat_coords[i&1],
lon_coords[(i>>2)^1], lat_coords[(i>>1)&1],
lon_coords[(i>>2)^1], lat_coords[(i>>1)&1],
0, lat_coords[i&1],
0, -lat_coords[i&1],
(((i&1)==((i>>1)&1))?
(p_between_ab+p_between_cd):
(-1)));
}
for (int j = 0; j < 2; ++j) {
double lat_coords[2][2] = {{90, 90}, {-10, 10}};
int ref_ret_val[2] = {p_between_ab, p_between_cd};
for (int i = 0; i < 2; ++i) {
double lon_coords[2] = {0, 10};
test_loncxlonc(lon_coords[i], lat_coords[j][0],
lon_coords[i], lat_coords[j][1],
lon_coords[i^1], lat_coords[j^1][0],
lon_coords[i^1], lat_coords[j^1][1],
0, 90,
0, -90,
ref_ret_val[j]);
}
}
for (int i = 0; i < 4; ++i) {
double lat_coords[2][2] = {{-89, 89},{-90, 90}};
int ret_val[2] = {p_between_ab+q_between_cd,
p_between_ab+p_between_cd};
test_loncxlonc( 0, lat_coords[0][i&1],
180, lat_coords[0][i&1],
45, lat_coords[0][i>>1],
225, lat_coords[0][i>>1],
0, lat_coords[1][i&1],
0, -lat_coords[1][i&1],
ret_val[(i&1)==(i>>1)]);
}
for (int i = 0; i < 4; ++i) {
double lat_coords[2][2] = {{-85, 85}, {-90, 90}};
int ret_val[2] = {p_between_ab + q_between_cd,
p_between_ab + p_between_cd};
test_loncxlonc( 0, lat_coords[0][i&1],
180, lat_coords[0][i&1],
45, lat_coords[0][i>>1],
225, lat_coords[0][i>>1],
0, lat_coords[1][i&1],
0, lat_coords[1][(i&1)^1],
ret_val[(i&1)==(i>>1)]);
}
for (int j = 0; j < 4; ++j) {
double lon_coords[2] = {0, 180};
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-85, 85}, {-90, 90}};
test_loncxlonc(lon_coords[j&1], lat_coords[0][i&1],
lon_coords[(j&1)^1], lat_coords[0][i&1],
lon_coords[j>>1], lat_coords[0][(i&1)^1],
lon_coords[(j>>1)^1], lat_coords[0][(i&1)^1],
0, lat_coords[1][i&1],
0, lat_coords[1][(i&1)^1],
p_between_ab + q_between_cd + circles_are_identically);
}
}
for (int j = 0; j < 2; ++j) {
double lon_coords[2] = {0, 60};
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-85, -90}, {85, 90}};
test_loncxlonc(lon_coords[j], lat_coords[i][0],
lon_coords[j], lat_coords[i][1],
lon_coords[j^1], lat_coords[i][0],
lon_coords[j^1], lat_coords[i][1],
0, lat_coords[i][1],
0, lat_coords[i^1][1],
p_between_ab + p_between_cd);
}
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-85, -90}, {85, 90}};
test_loncxlonc(60, lat_coords[i][0],
60, lat_coords[i][1],
60+180, lat_coords[i][0],
60+180, lat_coords[i][1],
0, lat_coords[i][1],
0, lat_coords[i][1],
p_between_ab + p_between_cd +
q_between_ab + q_between_cd +
circles_are_identically);
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-85, -80}, {85, 80}};
test_loncxlonc(60, lat_coords[i][0],
60+180, lat_coords[i][1],
60+180, lat_coords[i][0],
60, lat_coords[i][1],
60, lat_coords[i][0],
60+180, lat_coords[i][0],
p_between_ab + p_between_cd +
q_between_ab + q_between_cd + circles_are_identically);
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
double lat_coords[2][2] = {{-85, -80}, {85, 80}};
test_loncxlonc(60, lat_coords[i][j],
60+180, lat_coords[i][j],
60+180, lat_coords[i][j^1],
60, lat_coords[i][j^1],
60, lat_coords[i][0],
60+180, lat_coords[i][0],
p_between_ab + p_between_cd +
q_between_ab + q_between_cd + circles_are_identically);
}
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
double lat_coords[2][3] = {{-80, -85, -90}, {80, 85, 90}};
test_loncxlonc(60, lat_coords[i][j],
60, lat_coords[i][2],
60, lat_coords[i][j^1],
60, lat_coords[i][2],
60, lat_coords[i][1],
60, lat_coords[i][2],
p_between_ab + p_between_cd +
q_between_ab + q_between_cd + circles_are_identically);
}
}
for (int i = 0; i < 2; ++i) {
double lat_coords[2][2] = {{-85, -90}, {85, 90}};
test_loncxlonc(60, lat_coords[i][0],
60, lat_coords[i][1],
60, lat_coords[i][0],
60, lat_coords[i][1],
60, lat_coords[i][0],
60, lat_coords[i][1],
p_between_ab + p_between_cd +
q_between_ab + q_between_cd + circles_are_identically);
}
return TEST_EXIT_CODE;
}
static void test_loncxlonc(double lon_a, double lat_a, double lon_b, double lat_b,
double lon_c, double lat_c, double lon_d, double lat_d,
double lon_ref_p, double lat_ref_p,
double lon_ref_q, double lat_ref_q, int ref_ret_val) {
test_cxc(lon_a, lat_a, lon_b, lat_b, lon_c, lat_c, lon_d, lat_d,
lon_ref_p, lat_ref_p, lon_ref_q, lat_ref_q, ref_ret_val);
}
int main(int argc, char **argv)
@ YAC_LON_CIRCLE_EDGE
longitude circle