aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-05-03 21:34:50 +0200
committerKristian Evers <kristianevers@gmail.com>2016-05-03 21:34:50 +0200
commit469396398760c183c5f792bd41bff42ad5cd16cd (patch)
treec72b11826e97245091576c5ef29c34057e3fd9f7 /src
parente3a5bfccd02703033dd8821d61b10a7111843ebe (diff)
downloadPROJ-469396398760c183c5f792bd41bff42ad5cd16cd.tar.gz
PROJ-469396398760c183c5f792bd41bff42ad5cd16cd.zip
Converted putp6 and putp6p
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c2
-rw-r--r--src/PJ_putp6.c247
2 files changed, 192 insertions, 57 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 31a30e47..931a853c 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -365,8 +365,6 @@ int pj_lonlat_selftest (void) {return 10000;}
int pj_longlat_selftest (void) {return 10000;}
int pj_ob_tran_selftest (void) {return 10000;}
-int pj_putp6_selftest (void) {return 10000;}
-int pj_putp6p_selftest (void) {return 10000;}
int pj_qsc_selftest (void) {return 10000;}
int pj_robin_selftest (void) {return 10000;}
diff --git a/src/PJ_putp6.c b/src/PJ_putp6.c
index 5909dd4c..7c860cdb 100644
--- a/src/PJ_putp6.c
+++ b/src/PJ_putp6.c
@@ -1,59 +1,196 @@
-#define PROJ_PARMS__ \
- double C_x, C_y, A, B, D;
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
+struct pj_opaque {
+ double C_x, C_y, A, B, D;
+};
+
PROJ_HEAD(putp6, "Putnins P6") "\n\tPCyl., Sph.";
PROJ_HEAD(putp6p, "Putnins P6'") "\n\tPCyl., Sph.";
-#define EPS 1e-10
-#define NITER 10
+
+#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->ctx, ( (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))
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
+ struct pj_opaque *Q = P->opaque;
+ double p, r, V;
+ int i;
+
+ p = Q->B * sin(lp.phi);
+ lp.phi *= 1.10265779;
+ for (i = NITER; i ; --i) {
+ r = sqrt(1. + lp.phi * lp.phi);
+ lp.phi -= V = ( (Q->A - r) * lp.phi - log(lp.phi + r) - p ) /
+ (Q->A - 2. * r);
+ if (fabs(V) < EPS)
+ break;
+ }
+ if (!i)
+ lp.phi = p < 0. ? -CON_POLE : CON_POLE;
+ xy.x = Q->C_x * lp.lam * (Q->D - sqrt(1. + lp.phi * lp.phi));
+ xy.y = Q->C_y * lp.phi;
+
+ return xy;
+}
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
+ LP lp = {0.0,0.0};
+ struct pj_opaque *Q = P->opaque;
+ double r;
+
+ lp.phi = xy.y / Q->C_y;
+ r = sqrt(1. + lp.phi * lp.phi);
+ lp.lam = xy.x / (Q->C_x * (Q->D - r));
+ lp.phi = aasin( P->ctx, ( (Q->A - r) * lp.phi - log(lp.phi + r) ) / Q->B);
+
+ return lp;
+}
+
+
+static void *freeup_new (PJ *P) { /* Destructor */
+ if (0==P)
+ return 0;
+ if (0==P->opaque)
+ return pj_dealloc (P);
+
+ pj_dealloc (P->opaque);
+ return pj_dealloc(P);
+}
+
+
+static void freeup (PJ *P) {
+ freeup_new (P);
+ return;
+}
+
+
+PJ *PROJECTION(putp6) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ Q->C_x = 1.01346;
+ Q->C_y = 0.91910;
+ Q->A = 4.;
+ Q->B = 2.1471437182129378784;
+ Q->D = 2.;
+
+ P->es = 0.;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+
+PJ *PROJECTION(putp6p) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ Q->C_x = 0.44329;
+ Q->C_y = 0.80404;
+ Q->A = 6.;
+ Q->B = 5.61125;
+ Q->D = 3.;
+
+ P->es = 0.;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_putp6_selftest (void) {return 0;}
+#else
+
+int pj_putp6_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=putp6 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 226369.395133402577, 110218.523796520662},
+ { 226369.395133402577, -110218.523796520749},
+ {-226369.395133402577, 110218.523796520662},
+ {-226369.395133402577, -110218.523796520749},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.00176671315102969921, 0.000907295534210503544},
+ { 0.00176671315102969921, -0.000907295534205924308},
+ {-0.00176671315102969921, 0.000907295534210503544},
+ {-0.00176671315102969921, -0.000907295534205924308},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
+}
+
+#endif
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_putp6p_selftest (void) {return 0;}
+#else
+
+int pj_putp6p_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=putp6p +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 198034.195132195076, 125989.475461323193},
+ { 198034.195132195076, -125989.475461323193},
+ {-198034.195132195076, 125989.475461323193},
+ {-198034.195132195076, -125989.475461323193},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.00201955053120177067, 0.000793716441164738612},
+ { 0.00201955053120177067, -0.000793716441164738612},
+ {-0.00201955053120177067, 0.000793716441164738612},
+ {-0.00201955053120177067, -0.000793716441164738612},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
+}
+
+#endif