summaryrefslogtreecommitdiff
path: root/src/3rdparty/proj/PJ_lagrng.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/proj/PJ_lagrng.c')
-rw-r--r--src/3rdparty/proj/PJ_lagrng.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/3rdparty/proj/PJ_lagrng.c b/src/3rdparty/proj/PJ_lagrng.c
new file mode 100644
index 00000000..d0e123a9
--- /dev/null
+++ b/src/3rdparty/proj/PJ_lagrng.c
@@ -0,0 +1,35 @@
+#define PROJ_PARMS__ \
+ double hrw; \
+ double rw; \
+ double a1;
+#define TOL 1e-10
+#define PJ_LIB__
+#include <projects.h>
+PROJ_HEAD(lagrng, "Lagrange") "\n\tMisc Sph, no inv.\n\tW=";
+FORWARD(s_forward); /* spheroid */
+ double v, c;
+
+ if (fabs(fabs(lp.phi) - HALFPI) < TOL) {
+ xy.x = 0;
+ xy.y = lp.phi < 0 ? -2. : 2.;
+ } else {
+ lp.phi = sin(lp.phi);
+ v = P->a1 * pow((1. + lp.phi)/(1. - lp.phi), P->hrw);
+ if ((c = 0.5 * (v + 1./v) + cos(lp.lam *= P->rw)) < TOL)
+ F_ERROR;
+ xy.x = 2. * sin(lp.lam) / c;
+ xy.y = (v - 1./v) / c;
+ }
+ return (xy);
+}
+FREEUP; if (P) pj_dalloc(P); }
+ENTRY0(lagrng)
+ double phi1;
+
+ if ((P->rw = pj_param(P->params, "dW").f) <= 0) E_ERROR(-27);
+ P->hrw = 0.5 * (P->rw = 1. / P->rw);
+ phi1 = pj_param(P->params, "rlat_1").f;
+ if (fabs(fabs(phi1 = sin(phi1)) - 1.) < TOL) E_ERROR(-22);
+ P->a1 = pow((1. - phi1)/(1. + phi1), P->hrw);
+ P->es = 0.; P->fwd = s_forward;
+ENDENTRY(P)