diff options
Diffstat (limited to 'src/nad_cvt.c')
| -rw-r--r-- | src/nad_cvt.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/nad_cvt.c b/src/nad_cvt.c new file mode 100644 index 00000000..600ea3cd --- /dev/null +++ b/src/nad_cvt.c @@ -0,0 +1,49 @@ +#ifndef lint +static const char SCCSID[]="@(#)nad_cvt.c 4.3 95/09/23 GIE REL"; +#endif +#define PJ_LIB__ +#include <projects.h> +#define MAX_TRY 9 +#define TOL 1e-12 + LP +nad_cvt(LP in, int inverse, struct CTABLE *ct) { + LP t, tb; + + if (in.lam == HUGE_VAL) + return in; + /* normalize input to ll origin */ + tb = in; + tb.lam -= ct->ll.lam; + tb.phi -= ct->ll.phi; + tb.lam = adjlon(tb.lam); + t = nad_intr(tb, ct); + if (inverse) { + LP del, dif; + int i = MAX_TRY; + + if (t.lam == HUGE_VAL) return t; + t.lam = tb.lam + t.lam; + t.phi = tb.phi - t.phi; + + do { + del = nad_intr(t, ct); + if (del.lam == HUGE_VAL) return del; + t.lam -= dif.lam = t.lam - del.lam - tb.lam; + t.phi -= dif.phi = t.phi + del.phi - tb.phi; + } while (i-- && fabs(dif.lam) > TOL && fabs(dif.phi) > TOL); + if (i < 0) { + t.lam = t.phi = HUGE_VAL; + return t; + } + in.lam = adjlon(t.lam + ct->ll.lam); + in.phi = t.phi + ct->ll.phi; + } else { + if (t.lam == HUGE_VAL) + in = t; + else { + in.lam -= t.lam; + in.phi += t.phi; + } + } + return in; +} |
