libacfutils
A general purpose library of utility functions designed to make it easier to develop addons for the X-Plane flight simulator.
Loading...
Searching...
No Matches
geom.h
Go to the documentation of this file.
1/*
2 * CDDL HEADER START
3 *
4 * This file and its contents are supplied under the terms of the
5 * Common Development and Distribution License ("CDDL"), version 1.0.
6 * You may only use this file in accordance with the terms of version
7 * 1.0 of the CDDL.
8 *
9 * A full copy of the text of the CDDL should have accompanied this
10 * source. A copy of the CDDL is also available via the Internet at
11 * http://www.illumos.org/license/CDDL.
12 *
13 * CDDL HEADER END
14 */
15/*
16 * Copyright 2023 Saso Kiselkov. All rights reserved.
17 */
24#ifndef _ACF_UTILS_GEOM_H_
25#define _ACF_UTILS_GEOM_H_
26
27#include <stdlib.h>
28#include <math.h>
29
30#include "sysmacros.h"
31#include "types.h"
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
40typedef struct {
41 double lat;
42 double lon;
43 double elev;
45
49typedef struct {
50 double lat;
51 double lon;
53
58typedef struct {
59 float lat;
60 float lon;
61 float elev;
67typedef struct {
68 float lat;
69 float lon;
71
89typedef struct {
90 double x;
91 double y;
92 double z;
93} vect3_t;
94
96typedef struct {
97 long double x;
98 long double y;
99 long double z;
100} vect3l_t;
101
116typedef struct vect2_s {
117 double x;
118 double y;
119} vect2_t;
120
130typedef struct {
131 double a;
132 double b;
133 double f;
134 double ecc;
135 double ecc2;
136 double r;
137} ellip_t;
138
143typedef struct {
144 size_t n_pts;
145 vect2_t *pts;
146} bezier_t;
147
148/*
149 * Unit conversions
150 */
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)
159
160/*
161 * Coordinate constructors.
162 */
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)))
203
204/*
205 * Special coordinate values and tests for these special values.
206 */
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)
283
285#define EARTH_MSL 6371200
286
287/* Math debugging */
288#if 1
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)
294#else
295#define PRINT_VECT2(v)
296#define PRINT_VECT3(v)
297#define PRINT_GEO2(p)
298#define PRINT_GEO3(p)
299#endif
300
301/*
302 * The standard WGS84 ellipsoid.
303 */
304API_EXPORT_DATA const ellip_t wgs84;
305
306/*
307 * Small helpers.
308 */
309API_EXPORT bool_t is_on_arc(double angle_x, double angle1, double angle2,
310 bool_t cw);
311
312/*
313 * Angle util functions.
314 */
315API_EXPORT double rel_angle(double a1, double a2) PURE_ATTR;
316
317/*
318 * Vector math.
319 */
320API_EXPORT double vect3_abs(vect3_t a) PURE_ATTR;
321API_EXPORT long double vect3l_abs(vect3l_t a) PURE_ATTR;
322API_EXPORT double vect3_dist(vect3_t a, vect3_t b) PURE_ATTR;
323API_EXPORT long double vect3l_dist(vect3l_t a, vect3l_t b) PURE_ATTR;
324API_EXPORT double vect2_abs(vect2_t a) PURE_ATTR;
325API_EXPORT double vect2_dist(vect2_t a, vect2_t b) PURE_ATTR;
326API_EXPORT vect3_t vect3_set_abs(vect3_t a, double abs) PURE_ATTR;
327API_EXPORT vect3l_t vect3l_set_abs(vect3l_t a, long double abs) PURE_ATTR;
328API_EXPORT vect2_t vect2_set_abs(vect2_t a, double abs) PURE_ATTR;
329API_EXPORT vect3_t vect3_unit(vect3_t a, double *l);
330API_EXPORT vect2_t vect2_unit(vect2_t a, double *l);
331
332API_EXPORT vect3_t vect3_add(vect3_t a, vect3_t b) PURE_ATTR;
333API_EXPORT vect3l_t vect3l_add(vect3l_t a, vect3l_t b) PURE_ATTR;
334API_EXPORT vect2_t vect2_add(vect2_t a, vect2_t b) PURE_ATTR;
335API_EXPORT vect3_t vect3_sub(vect3_t a, vect3_t b) PURE_ATTR;
336API_EXPORT vect3l_t vect3l_sub(vect3l_t a, vect3l_t b) PURE_ATTR;
337API_EXPORT vect2_t vect2_sub(vect2_t a, vect2_t b) PURE_ATTR;
338API_EXPORT vect3_t vect3_mul(vect3_t a, vect3_t b) PURE_ATTR;
339API_EXPORT vect3l_t vect3l_mul(vect3l_t a, vect3l_t b) PURE_ATTR;
340API_EXPORT vect2_t vect2_mul(vect2_t a, vect2_t b) PURE_ATTR;
341API_EXPORT vect3_t vect3_scmul(vect3_t a, double b) PURE_ATTR;
342API_EXPORT vect3l_t vect3l_scmul(vect3l_t a, long double b) PURE_ATTR;
343API_EXPORT vect2_t vect2_scmul(vect2_t a, double b) PURE_ATTR;
344API_EXPORT double vect3_dotprod(vect3_t a, vect3_t b) PURE_ATTR;
345API_EXPORT long double vect3l_dotprod(vect3l_t a, vect3l_t b) PURE_ATTR;
346API_EXPORT double vect2_dotprod(vect2_t a, vect2_t b) PURE_ATTR;
347API_EXPORT vect3_t vect3_xprod(vect3_t a, vect3_t b) PURE_ATTR;
348API_EXPORT vect3l_t vect3l_xprod(vect3l_t a, vect3l_t b) PURE_ATTR;
349API_EXPORT vect3_t vect3_mean(vect3_t a, vect3_t b) PURE_ATTR;
350API_EXPORT vect3l_t vect3l_mean(vect3l_t a, vect3l_t b) PURE_ATTR;
351API_EXPORT vect2_t vect2_mean(vect2_t a, vect2_t b) PURE_ATTR;
352
353API_EXPORT vect2_t vect2_norm(vect2_t v, bool_t right) PURE_ATTR;
354API_EXPORT vect3_t vect3_rot(vect3_t v, double angle, unsigned axis) PURE_ATTR;
355API_EXPORT vect3l_t vect3l_rot(vect3l_t v, long double angle, unsigned axis)
356 PURE_ATTR;
357API_EXPORT vect2_t vect2_rot(vect2_t v, double angle) PURE_ATTR;
358API_EXPORT vect2_t vect2_rot_inv_y(vect2_t v, double angle) PURE_ATTR;
359API_EXPORT vect3_t vect3_neg(vect3_t v) PURE_ATTR;
360API_EXPORT vect3l_t vect3l_neg(vect3l_t v) PURE_ATTR;
361API_EXPORT vect2_t vect2_neg(vect2_t v) PURE_ATTR;
362
363API_EXPORT vect3_t vect3_local2acf(vect3_t v, double roll, double pitch,
364 double hdgt) PURE_ATTR;
365API_EXPORT vect3_t vect3_acf2local(vect3_t v, double roll, double pitch,
366 double hdgt) PURE_ATTR;
367
368/*
369 * Spherical, geodesic, ECEF and ECmI coordinate conversion.
370 */
371API_EXPORT ellip_t ellip_init(double semi_major, double semi_minor,
372 double flattening);
373API_EXPORT geo_pos3_t geo2sph(geo_pos3_t pos, const ellip_t *ellip) PURE_ATTR;
374API_EXPORT vect3_t geo2ecef_mtr(geo_pos3_t pos, const ellip_t *ellip) PURE_ATTR;
375API_EXPORT vect3_t geo2ecef_ft(geo_pos3_t pos, const ellip_t *ellip) PURE_ATTR;
376API_EXPORT geo_pos3_t ecef2geo(vect3_t pos, const ellip_t *ellip) PURE_ATTR;
377API_EXPORT geo_pos3_t ecef2sph(vect3_t v) PURE_ATTR;
378API_EXPORT vect3_t sph2ecef(geo_pos3_t pos) PURE_ATTR;
379/*
380 * Converts between ECEF/ECMI coordinates and OpenGL coordinates. OpenGL
381 * uses X to represent the lateral aixs, Y to represent the vertical axis
382 * and Z to represent the axis going towards the camera.
383 */
384API_EXPORT vect3_t ecef2gl(vect3_t ecmi) PURE_ATTR;
385API_EXPORT vect3_t gl2ecef(vect3_t opengl) PURE_ATTR;
386API_EXPORT vect3l_t ecef2gl_l(vect3l_t ecmi) PURE_ATTR;
387API_EXPORT vect3l_t gl2ecef_l(vect3l_t opengl) PURE_ATTR;
388/*
389 * ECmI stands for Earth-Centered-modified-Inertial. Unlike ECEF, it is
390 * an inertial frame that doesn't rotate together with the earth. However,
391 * unlike plain ECI coordinates, ECmI is aligned with the Earth equatorial
392 * plane, not the Earth's orbital plane around the Sun. This makes it a
393 * bit easier to use for inertial calculations for objects moving around
394 * on the Earth (like airplanes, duh). In ECmI, the X and Y axes are
395 * aligned with the 0 and 90 degree meridians respectively ONLY at the
396 * coordinate reference time (delta_t=0). Thus, to convert between
397 * geographic or ECEF coordinates and ECmI, we need to know the exact time
398 * as a delta from the reference time (which can be arbitrary).
399 */
400API_EXPORT vect3_t geo2ecmi(geo_pos3_t pos, double delta_t,
401 const ellip_t *ellip) PURE_ATTR;
402API_EXPORT geo_pos3_t ecmi2geo(vect3_t pos, double delta_t,
403 const ellip_t *ellip) PURE_ATTR;
404API_EXPORT vect3_t sph2ecmi(geo_pos3_t pos, double delta_t) PURE_ATTR;
405API_EXPORT geo_pos3_t ecmi2sph(vect3_t pos, double delta_t) PURE_ATTR;
406API_EXPORT vect3_t ecef2ecmi(vect3_t ecef, double delta_t) PURE_ATTR;
407API_EXPORT vect3_t ecmi2ecef(vect3_t ecmi, double delta_t) PURE_ATTR;
408
409/*
410 * Interesections.
411 */
412API_EXPORT unsigned vect2sph_isect(vect3_t v, vect3_t o, vect3_t c, double r,
413 bool_t confined, vect3_t i[2]);
414API_EXPORT unsigned vect2circ_isect(vect2_t v, vect2_t o, vect2_t c, double r,
415 bool_t confined, vect2_t i[2]);
416API_EXPORT vect2_t vect2vect_isect(vect2_t da, vect2_t oa, vect2_t db,
417 vect2_t ob, bool_t confined) PURE_ATTR;
418API_EXPORT unsigned circ2circ_isect(vect2_t ca, double ra, vect2_t cb,
419 double rb, vect2_t i[2]);
420API_EXPORT unsigned vect2poly_isect_get(vect2_t a, vect2_t oa,
421 const vect2_t *poly, vect2_t *isects, unsigned cap);
422API_EXPORT unsigned vect2poly_isect(vect2_t a, vect2_t oa, const vect2_t *poly)
423 PURE_ATTR;
424API_EXPORT bool_t point_in_poly(vect2_t pt, const vect2_t *poly) PURE_ATTR;
425
426/*
427 * Converting between headings and direction vectors on a 2D plane.
428 */
429API_EXPORT vect2_t hdg2dir(double truehdg) PURE_ATTR;
430API_EXPORT double dir2hdg(vect2_t dir) PURE_ATTR;
431
432/*
433 * Calculating coordinate displacement & radial intersection.
434 */
435API_EXPORT geo_pos2_t geo_displace(const ellip_t *ellip, geo_pos2_t pos,
436 double truehdg, double dist) PURE_ATTR;
437API_EXPORT geo_pos2_t geo_displace_dir(const ellip_t *ellip, geo_pos2_t pos,
438 vect2_t dir, double dist) PURE_ATTR;
439
440/*
441 * Geometry parser & validator helpers.
442 */
443API_EXPORT bool_t geo_pos2_from_str(const char *lat, const char *lon,
444 geo_pos2_t *pos);
445API_EXPORT bool_t geo_pos3_from_str(const char *lat, const char *lon,
446 const char *elev, geo_pos3_t *pos);
447
448/*
449 * Spherical coordinate system translation.
450 */
451typedef struct {
452 double sph_matrix[3 * 3];
453 double rot_matrix[2 * 2];
454 bool_t inv;
456
457API_EXPORT sph_xlate_t sph_xlate_init(geo_pos2_t displacement,
458 double rotation, bool_t inv);
459API_EXPORT geo_pos2_t sph_xlate(geo_pos2_t pos, const sph_xlate_t *xlate)
460 PURE_ATTR;
461API_EXPORT vect3_t sph_xlate_vect(vect3_t pos, const sph_xlate_t *xlate)
462 PURE_ATTR;
463
464/*
465 * Great circle functions.
466 */
467API_EXPORT double gc_distance(geo_pos2_t start, geo_pos2_t end);
468API_EXPORT double gc_point_hdg(geo_pos2_t start, geo_pos2_t end);
469
470/*
471 * Generic spherical - to - flat-plane projections.
472 */
473typedef struct {
474 const ellip_t *ellip;
475 sph_xlate_t xlate;
476 sph_xlate_t inv_xlate;
477 bool_t allow_inv;
478 double dist;
479 vect2_t scale;
480} fpp_t;
481
482API_EXPORT fpp_t fpp_init(geo_pos2_t center, double rot, double dist,
483 const ellip_t *ellip, bool_t allow_inv);
484API_EXPORT fpp_t ortho_fpp_init(geo_pos2_t center, double rot,
485 const ellip_t *ellip, bool_t allow_inv);
486API_EXPORT fpp_t gnomo_fpp_init(geo_pos2_t center, double rot,
487 const ellip_t *ellip, bool_t allow_inv);
488API_EXPORT fpp_t stereo_fpp_init(geo_pos2_t center, double rot,
489 const ellip_t *ellip, bool_t allow_inv);
490API_EXPORT vect2_t geo2fpp(geo_pos2_t pos, const fpp_t *fpp) PURE_ATTR;
491API_EXPORT geo_pos2_t fpp2geo(vect2_t pos, const fpp_t *fpp) PURE_ATTR;
492API_EXPORT void fpp_set_scale(fpp_t *fpp, vect2_t scale);
493API_EXPORT vect2_t fpp_get_scale(const fpp_t *fpp);
494API_EXPORT double fpp_get_gc_distance(vect2_t p1, vect2_t p2,
495 const fpp_t REQ_PTR(fpp)) PURE_ATTR;
496
497/*
498 * Lambert conformal conic projection
499 */
500typedef struct {
501 double reflat;
502 double reflon;
503 double n;
504 double F;
505 double rho0;
506} lcc_t;
507
508API_EXPORT lcc_t lcc_init(double reflat, double reflon, double stdpar1,
509 double stdpar2);
510API_EXPORT vect2_t geo2lcc(geo_pos2_t pos, const lcc_t *lcc) PURE_ATTR;
511
512/*
513 * Bezier curve functions.
514 */
515API_EXPORT bezier_t *bezier_alloc(size_t num_pts);
516API_EXPORT void bezier_free(bezier_t *curve);
517API_EXPORT double quad_bezier_func(double x, const bezier_t *func);
518API_EXPORT double *quad_bezier_func_inv(double y, const bezier_t *func,
519 size_t *n_xs);
520
521/*
522 * Matrix math.
523 */
524typedef struct {
525 double _mat4_data[16];
526} mat4_t;
527
528typedef struct {
529 double _mat3_data[9];
530} mat3_t;
531
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)
536
537API_EXPORT void mat4_ident(mat4_t *mat);
538API_EXPORT void mat3_ident(mat3_t *mat);
539
540#ifdef __cplusplus
541}
542#endif
543
544#endif /* _ACF_UTILS_GEOM_H_ */
unsigned vect2sph_isect(vect3_t v, vect3_t o, vect3_t c, double r, bool_t confined, vect3_t i[2])
Definition geom.c:1035
vect3_t vect3_neg(vect3_t v)
Definition geom.c:569
vect2_t fpp_get_scale(const fpp_t *fpp)
Definition geom.c:1863
vect3l_t vect3l_xprod(vect3l_t a, vect3l_t b)
Definition geom.c:427
geo_pos3_t ecmi2geo(vect3_t pos, double delta_t, const ellip_t *ellip)
Definition geom.c:712
vect3_t vect3_scmul(vect3_t a, double b)
Definition geom.c:355
vect2_t vect2vect_isect(vect2_t da, vect2_t oa, vect2_t db, vect2_t ob, bool_t confined)
Definition geom.c:1171
vect2_t vect2_add(vect2_t a, vect2_t b)
Definition geom.c:310
fpp_t gnomo_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
Definition geom.c:1723
vect2_t vect2_rot(vect2_t v, double angle)
Definition geom.c:548
vect3_t gl2ecef(vect3_t opengl)
Definition geom.c:781
vect3_t ecef2gl(vect3_t ecmi)
Definition geom.c:772
vect2_t geo2fpp(geo_pos2_t pos, const fpp_t *fpp)
Definition geom.c:1749
vect3_t vect3_xprod(vect3_t a, vect3_t b)
Definition geom.c:417
bool_t geo_pos3_from_str(const char *lat, const char *lon, const char *elev, geo_pos3_t *pos)
Definition geom.c:1454
vect2_t vect2_sub(vect2_t a, vect2_t b)
Definition geom.c:341
vect3_t vect3_mul(vect3_t a, vect3_t b)
Definition geom.c:163
vect3_t ecmi2ecef(vect3_t ecmi, double delta_t)
Definition geom.c:761
vect3_t vect3_add(vect3_t a, vect3_t b)
Definition geom.c:292
long double vect3l_dist(vect3l_t a, vect3l_t b)
Definition geom.c:142
double vect2_abs(vect2_t a)
Definition geom.c:151
long double vect3l_dotprod(vect3l_t a, vect3l_t b)
Definition geom.c:395
vect3_t vect3_local2acf(vect3_t v, double roll, double pitch, double hdgt)
Definition geom.c:600
geo_pos2_t geo_displace_dir(const ellip_t *ellip, geo_pos2_t pos, vect2_t dir, double dist)
Definition geom.c:1417
vect3l_t ecef2gl_l(vect3l_t ecmi)
Definition geom.c:790
void fpp_set_scale(fpp_t *fpp, vect2_t scale)
Definition geom.c:1850
bool_t geo_pos2_from_str(const char *lat, const char *lon, geo_pos2_t *pos)
Definition geom.c:1442
sph_xlate_t sph_xlate_init(geo_pos2_t displacement, double rotation, bool_t inv)
Definition geom.c:1498
bool_t point_in_poly(vect2_t pt, const vect2_t *poly)
Definition geom.c:1340
geo_pos2_t fpp2geo(vect2_t pos, const fpp_t *fpp)
Definition geom.c:1787
vect3_t sph2ecef(geo_pos3_t pos)
Definition geom.c:663
fpp_t fpp_init(geo_pos2_t center, double rot, double dist, const ellip_t *ellip, bool_t allow_inv)
Definition geom.c:1680
double gc_point_hdg(geo_pos2_t start, geo_pos2_t end)
Definition geom.c:1637
vect3_t geo2ecef_mtr(geo_pos3_t pos, const ellip_t *ellip)
Definition geom.c:861
vect3_t ecef2ecmi(vect3_t ecef, double delta_t)
Definition geom.c:749
geo_pos2_t sph_xlate(geo_pos2_t pos, const sph_xlate_t *xlate)
Definition geom.c:1602
vect3l_t gl2ecef_l(vect3l_t opengl)
Definition geom.c:799
unsigned vect2poly_isect(vect2_t a, vect2_t oa, const vect2_t *poly)
Definition geom.c:1326
vect3l_t vect3l_mul(vect3l_t a, vect3l_t b)
Definition geom.c:172
ellip_t ellip_init(double semi_major, double semi_minor, double flattening)
Definition geom.c:811
vect2_t vect2_scmul(vect2_t a, double b)
Definition geom.c:373
vect3_t vect3_acf2local(vect3_t v, double roll, double pitch, double hdgt)
Definition geom.c:610
fpp_t stereo_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
Definition geom.c:1736
double quad_bezier_func(double x, const bezier_t *func)
Definition geom.c:1975
bezier_t * bezier_alloc(size_t num_pts)
Definition geom.c:1939
geo_pos3_t ecmi2sph(vect3_t pos, double delta_t)
Definition geom.c:737
double fpp_get_gc_distance(vect2_t p1, vect2_t p2, const fpp_t *fpp)
Definition geom.c:1875
vect3_t vect3_set_abs(vect3_t a, double abs)
Definition geom.c:201
vect3_t vect3_rot(vect3_t v, double angle, unsigned axis)
Definition geom.c:479
void bezier_free(bezier_t *curve)
Definition geom.c:1953
vect2_t vect2_neg(vect2_t v)
Definition geom.c:587
double vect3_dotprod(vect3_t a, vect3_t b)
Definition geom.c:386
vect3l_t vect3l_scmul(vect3l_t a, long double b)
Definition geom.c:364
double gc_distance(geo_pos2_t start, geo_pos2_t end)
Definition geom.c:1615
void mat3_ident(mat3_t *mat)
Definition geom.c:2145
double dir2hdg(vect2_t dir)
Definition geom.c:1371
vect2_t vect2_mul(vect2_t a, vect2_t b)
Definition geom.c:181
vect3_t vect3_sub(vect3_t a, vect3_t b)
Definition geom.c:323
vect3l_t vect3l_sub(vect3l_t a, vect3l_t b)
Definition geom.c:332
vect3_t geo2ecmi(geo_pos3_t pos, double delta_t, const ellip_t *ellip)
Definition geom.c:695
bool_t is_on_arc(double angle_x, double angle1, double angle2, bool_t cw)
Definition geom.c:93
vect2_t vect2_set_abs(vect2_t a, double abs)
Definition geom.c:227
double vect3_dist(vect3_t a, vect3_t b)
Definition geom.c:133
vect2_t vect2_mean(vect2_t a, vect2_t b)
Definition geom.c:466
vect3l_t vect3l_set_abs(vect3l_t a, long double abs)
Definition geom.c:214
double * quad_bezier_func_inv(double y, const bezier_t *func, size_t *n_xs)
Definition geom.c:2088
geo_pos3_t geo2sph(geo_pos3_t pos, const ellip_t *ellip)
Definition geom.c:831
unsigned vect2poly_isect_get(vect2_t a, vect2_t oa, const vect2_t *poly, vect2_t *isects, unsigned cap)
Definition geom.c:1291
double vect2_dist(vect2_t a, vect2_t b)
Definition geom.c:190
double rel_angle(double a1, double a2)
Definition geom.c:623
vect3_t sph2ecmi(geo_pos3_t pos, double delta_t)
Definition geom.c:725
vect3_t vect3_mean(vect3_t a, vect3_t b)
Definition geom.c:448
geo_pos3_t ecef2geo(vect3_t pos, const ellip_t *ellip)
Definition geom.c:900
vect2_t vect2_norm(vect2_t v, bool_t right)
Definition geom.c:536
vect3_t sph_xlate_vect(vect3_t pos, const sph_xlate_t *xlate)
Definition geom.c:1565
double vect3_abs(vect3_t a)
Definition geom.c:115
unsigned circ2circ_isect(vect2_t ca, double ra, vect2_t cb, double rb, vect2_t i[2])
Definition geom.c:1220
fpp_t ortho_fpp_init(geo_pos2_t center, double rot, const ellip_t *ellip, bool_t allow_inv)
Definition geom.c:1711
unsigned vect2circ_isect(vect2_t v, vect2_t o, vect2_t c, double r, bool_t confined, vect2_t i[2])
Definition geom.c:1131
const ellip_t wgs84
Definition geom.c:38
vect3l_t vect3l_add(vect3l_t a, vect3l_t b)
Definition geom.c:301
double vect2_dotprod(vect2_t a, vect2_t b)
Definition geom.c:404
vect2_t vect2_rot_inv_y(vect2_t v, double angle)
Definition geom.c:559
geo_pos2_t geo_displace(const ellip_t *ellip, geo_pos2_t pos, double truehdg, double dist)
Definition geom.c:1405
long double vect3l_abs(vect3l_t a)
Definition geom.c:124
lcc_t lcc_init(double reflat, double reflon, double stdpar1, double stdpar2)
Definition geom.c:1892
vect3_t geo2ecef_ft(geo_pos3_t pos, const ellip_t *ellip)
Definition geom.c:884
vect3l_t vect3l_neg(vect3l_t v)
Definition geom.c:578
vect2_t geo2lcc(geo_pos2_t pos, const lcc_t *lcc)
Definition geom.c:1918
vect3_t vect3_unit(vect3_t a, double *l)
Definition geom.c:242
vect2_t vect2_unit(vect2_t a, double *l)
Definition geom.c:272
vect3l_t vect3l_mean(vect3l_t a, vect3l_t b)
Definition geom.c:457
vect3l_t vect3l_rot(vect3l_t v, long double angle, unsigned axis)
Definition geom.c:507
geo_pos3_t ecef2sph(vect3_t v)
Definition geom.c:987
vect2_t hdg2dir(double truehdg)
Definition geom.c:1359
void mat4_ident(mat4_t *mat)
Definition geom.c:2132
double a
Definition geom.h:131
double b
Definition geom.h:132
double f
Definition geom.h:133
double ecc2
Definition geom.h:135
double r
Definition geom.h:136
double ecc
Definition geom.h:134
Definition geom.h:473
float lat
Definition geom.h:68
float lon
Definition geom.h:69
double lat
Definition geom.h:50
double lon
Definition geom.h:51
float elev
Definition geom.h:61
float lat
Definition geom.h:59
float lon
Definition geom.h:60
double lat
Definition geom.h:41
double elev
Definition geom.h:43
double lon
Definition geom.h:42
Definition geom.h:500
Definition geom.h:528
Definition geom.h:524
Definition geom.h:89
#define REQ_PTR(x)
Definition sysmacros.h:334