26 double ref_p[3],
double ref_q[3],
33 if (ref_ret_value ==
error) {
36 PUT_ERR(
"error in ret_val (no error indicated)\n")
42 PUT_ERR(
"error in ret_val (identically circles)\n")
47 if (ret_val != ref_ret_value)
48 PUT_ERR(
"error in ret_val (a)");
60 if ((ret_val & mask_p) != (ref_ret_value & mask_p))
61 PUT_ERR(
"error in ret_val (b)\n")
66 if ((ret_val & mask_q) != (ref_ret_value & mask_q))
67 PUT_ERR(
"error in ret_val (c)\n")
74 if ((ret_val & mask_p) << 1 != (ref_ret_value & mask_q))
75 PUT_ERR(
"error in ret_val (d)\n")
80 if ((ret_val & mask_q) >> 1 != (ref_ret_value & mask_p))
81 PUT_ERR(
"error in ret_val (e)\n")
84 if (ref_ret_value == 0 && ret_val != 0)
85 PUT_ERR(
"error in return value (f)\n")
90void test_cxc_rad(
double lon_a,
double lat_a,
double lon_b,
double lat_b,
91 double lon_c,
double lat_c,
double lon_d,
double lat_d,
93 double lon_ref_p,
double lat_ref_p,
94 double lon_ref_q,
double lat_ref_q,
int ref_ret_val) {
96 double edges[2][2][3];
97 LLtoXYZ(lon_a, lat_a, edges[0][0]);
98 LLtoXYZ(lon_b, lat_b, edges[0][1]);
99 LLtoXYZ(lon_c, lat_c, edges[1][0]);
100 LLtoXYZ(lon_d, lat_d, edges[1][1]);
102 enum yac_edge_type edge_types[2] = {edge_type_a, edge_type_b};
105 LLtoXYZ(lon_ref_p, lat_ref_p, ref_pq[0]);
106 LLtoXYZ(lon_ref_q, lat_ref_q, ref_pq[1]);
108 int ref_ret_vals[2] =
111 (ref_ret_val & (~(1+2+4+8))) |
122 for (
int i = 0; i < 2; ++i) {
124 for (
int j = 0; j < 2; ++j) {
126 for (
int k = 0; k < 2; ++k) {
131 edge_types[i], edges[i][j], edges[i][j^1],
132 edge_types[i^1], edges[i^1][k], edges[i^1][k^1],
135 p, q, ret_val, ref_pq[i], ref_pq[i^1], ref_ret_vals[i]);
141void test_cxc(
double lon_a,
double lat_a,
double lon_b,
double lat_b,
142 double lon_c,
double lat_c,
double lon_d,
double lat_d,
144 double lon_ref_p,
double lat_ref_p,
145 double lon_ref_q,
double lat_ref_q,
int ref_ret_val) {
154 while (lon < ref - 180) lon += 360;
155 while (lon > ref + 180) lon -= 360;
161 double lon_a,
double lat_a,
double lon_b,
double lat_b,
162 double * lon_middle,
double * lat_middle) {
172 "ERROR(get_edge_middle_point): invalid edge_type")
179 middle[0] = a[0] + b[0];
180 middle[1] = a[1] + b[1];
181 middle[2] = a[2] + b[2];
185 XYZtoLL(middle, lon_middle, lat_middle);
191 *lon_middle = (lon_a +
adjust_lon(lon_b, lon_a))*0.5;
#define YAC_ASSERT(exp, msg)
static int points_are_identically(double const *a, double const *b)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
int yac_intersect_vec(enum yac_edge_type edge_type_a, double const a[3], double const b[3], enum yac_edge_type edge_type_b, double const c[3], double const d[3], double p[3], double q[3])
static void normalise_vector(double v[])
@ YAC_GREAT_CIRCLE_EDGE
great circle
@ YAC_LAT_CIRCLE_EDGE
latitude circle
@ YAC_LON_CIRCLE_EDGE
longitude circle
static void XYZtoLL(double const p_in[], double *lon, double *lat)
static void test_results_vec(double p[3], double q[3], int ret_val, double ref_p[3], double ref_q[3], int ref_ret_value)
void test_cxc(double lon_a, double lat_a, double lon_b, double lat_b, double lon_c, double lat_c, double lon_d, double lat_d, enum yac_edge_type edge_type_a, enum yac_edge_type edge_type_b, double lon_ref_p, double lat_ref_p, double lon_ref_q, double lat_ref_q, int ref_ret_val)
static double adjust_lon(double lon, double ref)
void test_cxc_rad(double lon_a, double lat_a, double lon_b, double lat_b, double lon_c, double lat_c, double lon_d, double lat_d, enum yac_edge_type edge_type_a, enum yac_edge_type edge_type_b, double lon_ref_p, double lat_ref_p, double lon_ref_q, double lat_ref_q, int ref_ret_val)
void get_edge_middle_point(enum yac_edge_type edge_type, double lon_a, double lat_a, double lon_b, double lat_b, double *lon_middle, double *lat_middle)
double(* p)(double lon, double lat)
static void LLtoXYZ(double lon, double lat, double p_out[])