aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-04-15 15:06:43 +0200
committerKristian Evers <kristianevers@gmail.com>2016-04-15 15:06:43 +0200
commitf38c90e53179c743809a128f08d8bffa6b636cd0 (patch)
tree44c3a756a23e22f08b478e31e590d858b1392c66
parent8ec40ec09591e60a5b45179654fbda2ebab5d4a4 (diff)
downloadPROJ-f38c90e53179c743809a128f08d8bffa6b636cd0.tar.gz
PROJ-f38c90e53179c743809a128f08d8bffa6b636cd0.zip
Converted eck3, putp1, wag6 and kav7. Expanded tabs.
-rw-r--r--src/PJ_aea.c4
-rw-r--r--src/PJ_eck3.c335
2 files changed, 290 insertions, 49 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index a94518dc..2ad6d4f4 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -355,7 +355,6 @@ source files
int pj_aeqd_selftest (void) {return 10000;}
int pj_alsk_selftest (void) {return 10000;}
-int pj_eck3_selftest (void) {return 10000;}
int pj_eck4_selftest (void) {return 10000;}
int pj_eck5_selftest (void) {return 10000;}
int pj_eck6_selftest (void) {return 10000;}
@@ -382,7 +381,6 @@ int pj_igh_selftest (void) {return 10000;}
int pj_imw_p_selftest (void) {return 10000;}
int pj_isea_selftest (void) {return 10000;}
-int pj_kav7_selftest (void) {return 10000;}
int pj_krovak_selftest (void) {return 10000;}
int pj_labrd_selftest (void) {return 10000;}
int pj_laea_selftest (void) {return 10000;}
@@ -423,7 +421,6 @@ int pj_omerc_selftest (void) {return 10000;}
int pj_ortho_selftest (void) {return 10000;}
int pj_patterson_selftest (void) {return 10000;}
int pj_poly_selftest (void) {return 10000;}
-int pj_putp1_selftest (void) {return 10000;}
int pj_putp2_selftest (void) {return 10000;}
int pj_putp3_selftest (void) {return 10000;}
int pj_putp3p_selftest (void) {return 10000;}
@@ -450,6 +447,5 @@ int pj_vandg3_selftest (void) {return 10000;}
int pj_vandg4_selftest (void) {return 10000;}
int pj_wag4_selftest (void) {return 10000;}
int pj_wag5_selftest (void) {return 10000;}
-int pj_wag6_selftest (void) {return 10000;}
int pj_weren_selftest (void) {return 10000;}
#endif
diff --git a/src/PJ_eck3.c b/src/PJ_eck3.c
index d7755f0c..3eb7f8f9 100644
--- a/src/PJ_eck3.c
+++ b/src/PJ_eck3.c
@@ -1,50 +1,295 @@
-#define PROJ_PARMS__ \
- double C_x, C_y, A, B;
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
PROJ_HEAD(eck3, "Eckert III") "\n\tPCyl, Sph.";
PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph.";
PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph.";
PROJ_HEAD(kav7, "Kavraisky VII") "\n\tPCyl, Sph.";
-FORWARD(s_forward); /* spheroid */
- xy.y = P->C_y * lp.phi;
- xy.x = P->C_x * lp.lam * (P->A + asqrt(1. - P->B * lp.phi * lp.phi));
- return (xy);
-}
-INVERSE(s_inverse); /* spheroid */
- lp.phi = xy.y / P->C_y;
- lp.lam = xy.x / (P->C_x * (P->A + asqrt(1. - P->B * lp.phi * lp.phi)));
- 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(eck3)
- P->C_x = .42223820031577120149;
- P->C_y = .84447640063154240298;
- P->A = 1.;
- P->B = 0.4052847345693510857755;
-ENDENTRY(setup(P))
-ENTRY0(kav7)
- P->C_x = 0.2632401569273184856851;
- P->C_x = 0.8660254037844;
- P->C_y = 1.;
- P->A = 0.;
- P->B = 0.30396355092701331433;
-ENDENTRY(setup(P))
-ENTRY0(wag6);
- P->C_x = P->C_y = 0.94745;
- P->A = 0.;
- P->B = 0.30396355092701331433;
-ENDENTRY(setup(P))
-ENTRY0(putp1);
- P->C_x = 1.89490;
- P->C_y = 0.94745;
- P->A = -0.5;
- P->B = 0.30396355092701331433;
-ENDENTRY(setup(P))
+
+struct pj_opaque {
+ double C_x, C_y, A, B;
+};
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
+ struct pj_opaque *Q = P->opaque;
+
+ xy.y = Q->C_y * lp.phi;
+ xy.x = Q->C_x * lp.lam * (Q->A + asqrt(1. - Q->B * lp.phi * 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;
+
+ lp.phi = xy.y / Q->C_y;
+ lp.lam = xy.x / (Q->C_x * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi)));
+ 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;
+}
+
+
+static PJ *setup(PJ *P) {
+ P->es = 0.;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+ return P;
+}
+
+
+PJ *PROJECTION(eck3) {
+ 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.42223820031577120149;
+ Q->C_y = 0.84447640063154240298;
+ Q->A = 1.0;
+ Q->B = 0.4052847345693510857755;
+
+ return setup(P);
+}
+
+
+PJ *PROJECTION(kav7) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ /* Defined twice in original code - Using 0.866...,
+ * but leaving the other one here as a safety measure.
+ * Q->C_x = 0.2632401569273184856851; */
+ Q->C_x = 0.8660254037844;
+ Q->C_y = 1.;
+ Q->A = 0.;
+ Q->B = 0.30396355092701331433;
+
+ return setup(P);
+}
+
+
+PJ *PROJECTION(wag6) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ Q->C_x = Q->C_y = 0.94745;
+ Q->A = 0.0;
+ Q->B = 0.30396355092701331433;
+
+ return setup(P);
+}
+
+
+PJ *PROJECTION(putp1) {
+ 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.89490;
+ Q->C_y = 0.94745;
+ Q->A = -0.5;
+ Q->B = 0.30396355092701331433;
+
+ return setup(P);
+}
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_eck3_selftest (void) {return 0;}
+#else
+
+int pj_eck3_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=eck3 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 188652.01572153764, 94328.919337031271},
+ { 188652.01572153764, -94328.919337031271},
+ {-188652.01572153764, 94328.919337031271},
+ {-188652.01572153764, -94328.919337031271},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.0021202405520236059, 0.0010601202759750307},
+ { 0.0021202405520236059, -0.0010601202759750307},
+ {-0.0021202405520236059, 0.0010601202759750307},
+ {-0.0021202405520236059, -0.0010601202759750307},
+ };
+
+ 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_kav7_selftest (void) {return 0;}
+#else
+
+int pj_kav7_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=kav7 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 193462.9749437288, 111701.07212763709},
+ { 193462.9749437288, -111701.07212763709},
+ {-193462.9749437288, 111701.07212763709},
+ {-193462.9749437288, -111701.07212763709}
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.0020674833579085268, 0.00089524655489191132},
+ { 0.0020674833579085268, -0.00089524655489191132},
+ {-0.0020674833579085268, 0.00089524655489191132},
+ {-0.0020674833579085268, -0.00089524655489191132}
+ };
+
+ 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_wag6_selftest (void) {return 0;}
+#else
+
+int pj_wag6_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=wag6 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 211652.56216440981, 105831.18078732977},
+ { 211652.56216440981, -105831.18078732977},
+ {-211652.56216440981, 105831.18078732977},
+ {-211652.56216440981, -105831.18078732977}
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.0018898022163257513, 0.000944901108123818},
+ { 0.0018898022163257513, -0.000944901108123818},
+ {-0.0018898022163257513, 0.000944901108123818},
+ {-0.0018898022163257513, -0.000944901108123818}
+ };
+
+ 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_putp1_selftest (void) {return 0;}
+#else
+
+int pj_putp1_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=putp1 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 211642.76275416015, 105831.18078732977},
+ { 211642.76275416015, -105831.18078732977},
+ {-211642.76275416015, 105831.18078732977},
+ {-211642.76275416015, -105831.18078732977}
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ { 0.0018898022164038663, 0.000944901108123818},
+ { 0.0018898022164038663, -0.000944901108123818},
+ {-0.0018898022164038663, 0.000944901108123818},
+ {-0.0018898022164038663, -0.000944901108123818}
+ };
+
+ 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