summaryrefslogtreecommitdiff
path: root/src/3rdparty/proj/PJ_putp6.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/proj/PJ_putp6.c')
-rw-r--r--src/3rdparty/proj/PJ_putp6.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/3rdparty/proj/PJ_putp6.c b/src/3rdparty/proj/PJ_putp6.c
new file mode 100644
index 00000000..28e82cfd
--- /dev/null
+++ b/src/3rdparty/proj/PJ_putp6.c
@@ -0,0 +1,59 @@
+#define PROJ_PARMS__ \
+ double C_x, C_y, A, B, D;
+#define PJ_LIB__
+#include <projects.h>
+PROJ_HEAD(putp6, "Putnins P6") "\n\tPCyl., Sph.";
+PROJ_HEAD(putp6p, "Putnins P6'") "\n\tPCyl., Sph.";
+#define EPS 1e-10
+#define NITER 10
+#define CON_POLE 1.732050807568877
+FORWARD(s_forward); /* spheroid */
+ double p, r, V;
+ int i;
+
+ p = P->B * sin(lp.phi);
+ lp.phi *= 1.10265779;
+ for (i = NITER; i ; --i) {
+ r = sqrt(1. + lp.phi * lp.phi);
+ lp.phi -= V = ( (P->A - r) * lp.phi - log(lp.phi + r) - p ) /
+ (P->A - 2. * r);
+ if (fabs(V) < EPS)
+ break;
+ }
+ if (!i)
+ lp.phi = p < 0. ? -CON_POLE : CON_POLE;
+ xy.x = P->C_x * lp.lam * (P->D - sqrt(1. + lp.phi * lp.phi));
+ xy.y = P->C_y * lp.phi;
+ return (xy);
+}
+INVERSE(s_inverse); /* spheroid */
+ double r;
+
+ lp.phi = xy.y / P->C_y;
+ r = sqrt(1. + lp.phi * lp.phi);
+ lp.lam = xy.x / (P->C_x * (P->D - r));
+ lp.phi = aasin( ( (P->A - r) * lp.phi - log(lp.phi + r) ) / P->B);
+ return (lp);
+}
+FREEUP; if (P) pj_dalloc(P); }
+ static PJ *
+setup(PJ *P) {
+ P->es = 0.;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+ return P;
+}
+ENTRY0(putp6)
+ P->C_x = 1.01346;
+ P->C_y = 0.91910;
+ P->A = 4.;
+ P->B = 2.1471437182129378784;
+ P->D = 2.;
+ENDENTRY(setup(P))
+ENTRY0(putp6p)
+ P->C_x = 0.44329;
+ P->C_y = 0.80404;
+ P->A = 6.;
+ P->B = 5.61125;
+ P->D = 3.;
+ENDENTRY(setup(P))