24#ifndef _ACF_UTILS_GEOM_H_
25#define _ACF_UTILS_GEOM_H_
116typedef struct vect2_s {
152#define RAD2DEG_RATIO (M_PI / 180.0)
154#define DEG2RAD_RATIO (180.0 / M_PI)
156#define DEG2RAD(d) ((d) * RAD2DEG_RATIO)
158#define RAD2DEG(r) ((r) * DEG2RAD_RATIO)
164#define GEO_POS2(lat, lon) ((geo_pos2_t){(lat), (lon)})
166#define GEO_POS3(lat, lon, elev) ((geo_pos3_t){(lat), (lon), (elev)})
168#define GEO_POS3_F32(lat, lon, elev) ((geo_pos3_f32_t){(lat), (lon), (elev)})
170#define GEO_POS2_F32(lat, lon) ((geo_pos2_f32_t){(lat), (lon)})
175#define TO_GEO3(geo3) \
176 ((geo_pos3_t){(geo3).lat, (geo3).lon, (geo3).elev})
181#define TO_GEO2(geo2) \
182 ((geo_pos2_t){(geo2).lat, (geo2).lon})
184#define TO_GEO3_32(geo3) \
185 ((geo_pos3_32_t){(geo3).lat, (geo3).lon, (geo3).elev})
187#define TO_GEO2_32(geo2) \
188 ((geo_pos3_32_t){(geo3).lat, (geo3).lon})
190#define VECT2(x, y) ((vect2_t){(x), (y)})
192#define VECT3(x, y, z) ((vect3_t){(x), (y), (z)})
194#define VECT3L(x, y, z) ((vect3l_t){(x), (y), (z)})
196#define VECT2_EQ(a, b) ((a).x == (b).x && (a).y == (b).y)
198#define VECT3_EQ(a, b) \
199 ((a).x == (b).x && (a).y == (b).y && (a).z == (b).z)
201#define VECT2_PARALLEL(a, b) \
202 (((a).y == 0 && (b).y == 0) || (((a).x / (a).y) == ((b).x / (b).y)))
208#define ZERO_VECT2 ((vect2_t){0.0, 0.0})
210#define ZERO_VECT3 ((vect3_t){0.0, 0.0, 0.0})
212#define ZERO_VECT3L ((vect3l_t){0.0, 0.0, 0.0})
214#define NULL_VECT2 ((vect2_t){NAN, NAN})
216#define NULL_VECT3 ((vect3_t){NAN, NAN, NAN})
218#define NULL_VECT3L ((vect3l_t){NAN, NAN, NAN})
220#define NULL_GEO_POS3 ((geo_pos3_t){NAN, NAN, NAN})
222#define NULL_GEO_POS3_32 ((geo_pos3_32_t){NAN, NAN, NAN})
224#define NULL_GEO_POS2 ((geo_pos2_t){NAN, NAN})
226#define NULL_GEO_POS2_32 ((geo_pos2_32_t){NAN, NAN})
228#define IS_NULL_VECT(a) (isnan((a).x))
230#define IS_NULL_VECT2(a) (isnan((a).x) || isnan((a).y))
232#define IS_NULL_VECT3(a) (isnan((a).x) || isnan((a).y) || isnan((a).z))
234#define IS_FINITE_VECT2(a) (isfinite((a).x) && isfinite((a).y))
236#define IS_FINITE_VECT3(a) \
237 (isfinite((a).x) && isfinite((a).y) && isfinite((a).z))
239#define IS_NULL_GEO_POS(a) (isnan((a).lat))
241#define IS_NULL_GEO_POS2(a) \
242 (isnan((a).lat) || isnan((a).lon))
244#define IS_NULL_GEO_POS3(a) \
245 (isnan((a).lat) || isnan((a).lon) || isnan((a).elev))
247#define IS_ZERO_VECT2(a) ((a).x == 0.0 && (a).y == 0.0)
249#define IS_ZERO_VECT3(a) ((a).x == 0.0 && (a).y == 0.0 && (a).z == 0.0)
253#define VECT2_TO_VECT3(v, z) ((vect3_t){(v).x, (v).y, (z)})
258#define VECT3_TO_VECT2(v) ((vect2_t){(v).x, (v).y})
260#define VECT3L_TO_VECT3(v) ((vect3_t){(v).x, (v).y, (v).z})
265#define VECT3_TO_VECT3L(v) ((vect3l_t){(v).x, (v).y, (v).z})
270#define GEO2_TO_GEO3(v, a) ((geo_pos3_t){(v).lat, (v).lon, (a)})
272#define GEO3_TO_GEO2(v) ((geo_pos2_t){(v).lat, (v).lon})
274#define GEO3_FT2M(g) GEO_POS3((g).lat, (g).lon, FEET2MET((g).elev))
276#define GEO3_M2FT(g) GEO_POS3((g).lat, (g).lon, MET2FEET((g).elev))
278#define GEO3_EQ(p1, p2) \
279 ((p1).lat == (p2).lat && (p1).lon == (p2).lon && \
280 (p1).elev == (p2).elev)
282#define GEO2_EQ(p1, p2) ((p1).lat == (p2).lat && (p1).lon == (p2).lon)
285#define EARTH_MSL 6371200
289#define PRINT_VECT2(v) printf(#v "(%f, %f)\n", v.x, v.y)
290#define PRINT_VECT3(v) printf(#v "(%f, %f, %f)\n", v.x, v.y, v.z)
291#define PRINT_VECT3L(v) printf(#v "(%Lf, %Lf, %Lf)\n", v.x, v.y, v.z)
292#define PRINT_GEO2(p) printf(#p "(%f, %f)\n", p.lat, p.lon)
293#define PRINT_GEO3(p) printf(#p "(%f, %f, %f)\n", p.lat, p.lon, p.elev)
295#define PRINT_VECT2(v)
296#define PRINT_VECT3(v)
309API_EXPORT bool_t
is_on_arc(
double angle_x,
double angle1,
double angle2,
315API_EXPORT
double rel_angle(
double a1,
double a2) PURE_ATTR;
364 double hdgt) PURE_ATTR;
366 double hdgt) PURE_ATTR;
401 const ellip_t *ellip) PURE_ATTR;
403 const ellip_t *ellip) PURE_ATTR;
413 bool_t confined,
vect3_t i[2]);
415 bool_t confined,
vect2_t i[2]);
417 vect2_t ob, bool_t confined) PURE_ATTR;
436 double truehdg,
double dist) PURE_ATTR;
438 vect2_t dir,
double dist) PURE_ATTR;
452 double sph_matrix[3 * 3];
453 double rot_matrix[2 * 2];
458 double rotation, bool_t inv);
483 const ellip_t *ellip, bool_t allow_inv);
485 const ellip_t *ellip, bool_t allow_inv);
487 const ellip_t *ellip, bool_t allow_inv);
489 const ellip_t *ellip, bool_t allow_inv);
508API_EXPORT
lcc_t lcc_init(
double reflat,
double reflon,
double stdpar1,
525 double _mat4_data[16];
529 double _mat3_data[9];
532#define MAT4(mat, col, row) ((mat)->_mat4_data[(col) * 4 + (row)])
533#define MAT3(mat, col, row) ((mat)->_mat3_data[(col) * 3 + (row)])
534#define MAT4_DATA(mat) ((mat)->_mat4_data)
535#define MAT3_DATA(mat) ((mat)->_mat3_data)
unsigned vect2sph_isect(vect3_t v, vect3_t o, vect3_t c, double r, bool_t confined, vect3_t i[2])
vect3_t vect3_neg(vect3_t v)
vect2_t fpp_get_scale(const fpp_t *fpp)
vect3l_t vect3l_xprod(vect3l_t a, vect3l_t b)
geo_pos3_t ecmi2geo(vect3_t pos, double delta_t, const ellip_t *ellip)
vect3_t vect3_scmul(vect3_t a, double b)
vect2_t vect2vect_isect(vect2_t da, vect2_t oa, vect2_t db, vect2_t ob, bool_t confined)
vect2_t vect2_add(vect2_t a, vect2_t b)
fpp_t gnomo_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
vect2_t vect2_rot(vect2_t v, double angle)
vect3_t gl2ecef(vect3_t opengl)
vect3_t ecef2gl(vect3_t ecmi)
vect2_t geo2fpp(geo_pos2_t pos, const fpp_t *fpp)
vect3_t vect3_xprod(vect3_t a, vect3_t b)
bool_t geo_pos3_from_str(const char *lat, const char *lon, const char *elev, geo_pos3_t *pos)
vect2_t vect2_sub(vect2_t a, vect2_t b)
vect3_t vect3_mul(vect3_t a, vect3_t b)
vect3_t ecmi2ecef(vect3_t ecmi, double delta_t)
vect3_t vect3_add(vect3_t a, vect3_t b)
long double vect3l_dist(vect3l_t a, vect3l_t b)
double vect2_abs(vect2_t a)
long double vect3l_dotprod(vect3l_t a, vect3l_t b)
vect3_t vect3_local2acf(vect3_t v, double roll, double pitch, double hdgt)
geo_pos2_t geo_displace_dir(const ellip_t *ellip, geo_pos2_t pos, vect2_t dir, double dist)
vect3l_t ecef2gl_l(vect3l_t ecmi)
void fpp_set_scale(fpp_t *fpp, vect2_t scale)
bool_t geo_pos2_from_str(const char *lat, const char *lon, geo_pos2_t *pos)
sph_xlate_t sph_xlate_init(geo_pos2_t displacement, double rotation, bool_t inv)
bool_t point_in_poly(vect2_t pt, const vect2_t *poly)
geo_pos2_t fpp2geo(vect2_t pos, const fpp_t *fpp)
vect3_t sph2ecef(geo_pos3_t pos)
fpp_t fpp_init(geo_pos2_t center, double rot, double dist, const ellip_t *ellip, bool_t allow_inv)
double gc_point_hdg(geo_pos2_t start, geo_pos2_t end)
vect3_t geo2ecef_mtr(geo_pos3_t pos, const ellip_t *ellip)
vect3_t ecef2ecmi(vect3_t ecef, double delta_t)
geo_pos2_t sph_xlate(geo_pos2_t pos, const sph_xlate_t *xlate)
vect3l_t gl2ecef_l(vect3l_t opengl)
unsigned vect2poly_isect(vect2_t a, vect2_t oa, const vect2_t *poly)
vect3l_t vect3l_mul(vect3l_t a, vect3l_t b)
ellip_t ellip_init(double semi_major, double semi_minor, double flattening)
vect2_t vect2_scmul(vect2_t a, double b)
vect3_t vect3_acf2local(vect3_t v, double roll, double pitch, double hdgt)
fpp_t stereo_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
double quad_bezier_func(double x, const bezier_t *func)
bezier_t * bezier_alloc(size_t num_pts)
geo_pos3_t ecmi2sph(vect3_t pos, double delta_t)
double fpp_get_gc_distance(vect2_t p1, vect2_t p2, const fpp_t *fpp)
vect3_t vect3_set_abs(vect3_t a, double abs)
vect3_t vect3_rot(vect3_t v, double angle, unsigned axis)
void bezier_free(bezier_t *curve)
vect2_t vect2_neg(vect2_t v)
double vect3_dotprod(vect3_t a, vect3_t b)
vect3l_t vect3l_scmul(vect3l_t a, long double b)
double gc_distance(geo_pos2_t start, geo_pos2_t end)
void mat3_ident(mat3_t *mat)
double dir2hdg(vect2_t dir)
vect2_t vect2_mul(vect2_t a, vect2_t b)
vect3_t vect3_sub(vect3_t a, vect3_t b)
vect3l_t vect3l_sub(vect3l_t a, vect3l_t b)
vect3_t geo2ecmi(geo_pos3_t pos, double delta_t, const ellip_t *ellip)
bool_t is_on_arc(double angle_x, double angle1, double angle2, bool_t cw)
vect2_t vect2_set_abs(vect2_t a, double abs)
double vect3_dist(vect3_t a, vect3_t b)
vect2_t vect2_mean(vect2_t a, vect2_t b)
vect3l_t vect3l_set_abs(vect3l_t a, long double abs)
double * quad_bezier_func_inv(double y, const bezier_t *func, size_t *n_xs)
geo_pos3_t geo2sph(geo_pos3_t pos, const ellip_t *ellip)
unsigned vect2poly_isect_get(vect2_t a, vect2_t oa, const vect2_t *poly, vect2_t *isects, unsigned cap)
double vect2_dist(vect2_t a, vect2_t b)
double rel_angle(double a1, double a2)
vect3_t sph2ecmi(geo_pos3_t pos, double delta_t)
vect3_t vect3_mean(vect3_t a, vect3_t b)
geo_pos3_t ecef2geo(vect3_t pos, const ellip_t *ellip)
vect2_t vect2_norm(vect2_t v, bool_t right)
vect3_t sph_xlate_vect(vect3_t pos, const sph_xlate_t *xlate)
double vect3_abs(vect3_t a)
unsigned circ2circ_isect(vect2_t ca, double ra, vect2_t cb, double rb, vect2_t i[2])
fpp_t ortho_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
unsigned vect2circ_isect(vect2_t v, vect2_t o, vect2_t c, double r, bool_t confined, vect2_t i[2])
vect3l_t vect3l_add(vect3l_t a, vect3l_t b)
double vect2_dotprod(vect2_t a, vect2_t b)
vect2_t vect2_rot_inv_y(vect2_t v, double angle)
geo_pos2_t geo_displace(const ellip_t *ellip, geo_pos2_t pos, double truehdg, double dist)
long double vect3l_abs(vect3l_t a)
lcc_t lcc_init(double reflat, double reflon, double stdpar1, double stdpar2)
vect3_t geo2ecef_ft(geo_pos3_t pos, const ellip_t *ellip)
vect3l_t vect3l_neg(vect3l_t v)
vect2_t geo2lcc(geo_pos2_t pos, const lcc_t *lcc)
vect3_t vect3_unit(vect3_t a, double *l)
vect2_t vect2_unit(vect2_t a, double *l)
vect3l_t vect3l_mean(vect3l_t a, vect3l_t b)
vect3l_t vect3l_rot(vect3l_t v, long double angle, unsigned axis)
geo_pos3_t ecef2sph(vect3_t v)
vect2_t hdg2dir(double truehdg)
void mat4_ident(mat4_t *mat)