aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Knudsen <lastname DOT firstname AT gmail DOT com>2016-04-12 23:14:02 +0200
committerThomas Knudsen <lastname DOT firstname AT gmail DOT com>2016-04-12 23:14:02 +0200
commit240b3cdd740630be906a99c1325f8aa7d3c91b71 (patch)
tree7acad5f3798ae5f8b47bc44200a5cf3d12e342c3 /src
parentc8f040f1d6b52f89825c9a1060545a97bf799487 (diff)
downloadPROJ-240b3cdd740630be906a99c1325f8aa7d3c91b71.tar.gz
PROJ-240b3cdd740630be906a99c1325f8aa7d3c91b71.zip
refactoring + added selftest for 7 more more projections
euler, murd1, murd2, murd3, pconic, tissot, vitk1 (7 projections in one file - PJ_sconics.c)
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c7
-rw-r--r--src/PJ_sconics.c827
2 files changed, 684 insertions, 150 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 7a507460..bd6c90ac 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -370,7 +370,6 @@ int pj_eck5_selftest (void) {return 10000;}
int pj_eck6_selftest (void) {return 10000;}
int pj_eqc_selftest (void) {return 10000;}
int pj_eqdc_selftest (void) {return 10000;}
-int pj_euler_selftest (void) {return 10000;}
int pj_etmerc_selftest (void) {return 10000;}
int pj_fahey_selftest (void) {return 10000;}
int pj_fouc_selftest (void) {return 10000;}
@@ -419,9 +418,6 @@ int pj_mil_os_selftest (void) {return 10000;}
int pj_mill_selftest (void) {return 10000;}
int pj_misrsom_selftest (void) {return 10000;}
int pj_moll_selftest (void) {return 10000;}
-int pj_murd1_selftest (void) {return 10000;}
-int pj_murd2_selftest (void) {return 10000;}
-int pj_murd3_selftest (void) {return 10000;}
int pj_natearth_selftest (void) {return 10000;}
int pj_natearth2_selftest (void) {return 10000;}
int pj_nell_selftest (void) {return 10000;}
@@ -435,7 +431,6 @@ int pj_oea_selftest (void) {return 10000;}
int pj_omerc_selftest (void) {return 10000;}
int pj_ortho_selftest (void) {return 10000;}
int pj_patterson_selftest (void) {return 10000;}
-int pj_pconic_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;}
@@ -457,7 +452,6 @@ int pj_somerc_selftest (void) {return 10000;}
int pj_stere_selftest (void) {return 10000;}
int pj_sterea_selftest (void) {return 10000;}
int pj_gstmerc_selftest (void) {return 10000;}
-int pj_tissot_selftest (void) {return 10000;}
int pj_tpers_selftest (void) {return 10000;}
int pj_ups_selftest (void) {return 10000;}
int pj_utm_selftest (void) {return 10000;}
@@ -465,7 +459,6 @@ int pj_vandg_selftest (void) {return 10000;}
int pj_vandg2_selftest (void) {return 10000;}
int pj_vandg3_selftest (void) {return 10000;}
int pj_vandg4_selftest (void) {return 10000;}
-int pj_vitk1_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;}
diff --git a/src/PJ_sconics.c b/src/PJ_sconics.c
index 8c17533d..2bf2213b 100644
--- a/src/PJ_sconics.c
+++ b/src/PJ_sconics.c
@@ -1,12 +1,17 @@
-#define PROJ_PARMS__ \
- double n; \
- double rho_c; \
- double rho_0; \
- double sig; \
- double c1, c2; \
- int type;
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
+
+struct pj_opaque {
+ double n;
+ double rho_c;
+ double rho_0;
+ double sig;
+ double c1, c2;
+ int type;
+};
+
+
#define EULER 0
#define MURD1 1
#define MURD2 2
@@ -14,141 +19,677 @@
#define PCONIC 4
#define TISSOT 5
#define VITK1 6
-#define EPS10 1.e-10
+#define EPS10 1.e-10
#define EPS 1e-10
#define LINE2 "\n\tConic, Sph\n\tlat_1= and lat_2="
-PROJ_HEAD(tissot, "Tissot")
- LINE2;
-PROJ_HEAD(murd1, "Murdoch I")
- LINE2;
-PROJ_HEAD(murd2, "Murdoch II")
- LINE2;
-PROJ_HEAD(murd3, "Murdoch III")
- LINE2;
-PROJ_HEAD(euler, "Euler")
- LINE2;
-PROJ_HEAD(pconic, "Perspective Conic")
- LINE2;
-PROJ_HEAD(vitk1, "Vitkovsky I")
- LINE2;
+
+PROJ_HEAD(euler, "Euler") LINE2;
+PROJ_HEAD(murd1, "Murdoch I") LINE2;
+PROJ_HEAD(murd2, "Murdoch II") LINE2;
+PROJ_HEAD(murd3, "Murdoch III") LINE2;
+PROJ_HEAD(pconic, "Perspective Conic") LINE2;
+PROJ_HEAD(tissot, "Tissot") LINE2;
+PROJ_HEAD(vitk1, "Vitkovsky I") LINE2;
+
+
+
/* get common factors for simple conics */
- static int
-phi12(PJ *P, double *del) {
- double p1, p2;
- int err = 0;
-
- if (!pj_param(P->ctx, P->params, "tlat_1").i ||
- !pj_param(P->ctx, P->params, "tlat_2").i) {
- err = -41;
- } else {
- p1 = pj_param(P->ctx, P->params, "rlat_1").f;
- p2 = pj_param(P->ctx, P->params, "rlat_2").f;
- *del = 0.5 * (p2 - p1);
- P->sig = 0.5 * (p2 + p1);
- err = (fabs(*del) < EPS || fabs(P->sig) < EPS) ? -42 : 0;
- *del = *del;
- }
- return err;
-}
-FORWARD(s_forward); /* spheroid */
- double rho;
-
- switch (P->type) {
- case MURD2:
- rho = P->rho_c + tan(P->sig - lp.phi);
- break;
- case PCONIC:
- rho = P->c2 * (P->c1 - tan(lp.phi - P->sig));
- break;
- default:
- rho = P->rho_c - lp.phi;
- break;
- }
- xy.x = rho * sin( lp.lam *= P->n );
- xy.y = P->rho_0 - rho * cos(lp.lam);
- return (xy);
-}
-INVERSE(s_inverse); /* ellipsoid & spheroid */
- double rho;
-
- rho = hypot(xy.x, xy.y = P->rho_0 - xy.y);
- if (P->n < 0.) {
- rho = - rho;
- xy.x = - xy.x;
- xy.y = - xy.y;
- }
- lp.lam = atan2(xy.x, xy.y) / P->n;
- switch (P->type) {
- case PCONIC:
- lp.phi = atan(P->c1 - rho / P->c2) + P->sig;
- break;
- case MURD2:
- lp.phi = P->sig - atan(rho - P->rho_c);
- break;
- default:
- lp.phi = P->rho_c - rho;
- }
- return (lp);
-}
-FREEUP; if (P) pj_dalloc(P); }
- static PJ *
-setup(PJ *P) {
- double del, cs;
- int i;
-
- if( (i = phi12(P, &del)) )
- E_ERROR(i);
- switch (P->type) {
- case TISSOT:
- P->n = sin(P->sig);
- cs = cos(del);
- P->rho_c = P->n / cs + cs / P->n;
- P->rho_0 = sqrt((P->rho_c - 2 * sin(P->phi0))/P->n);
- break;
- case MURD1:
- P->rho_c = sin(del)/(del * tan(P->sig)) + P->sig;
- P->rho_0 = P->rho_c - P->phi0;
- P->n = sin(P->sig);
- break;
- case MURD2:
- P->rho_c = (cs = sqrt(cos(del))) / tan(P->sig);
- P->rho_0 = P->rho_c + tan(P->sig - P->phi0);
- P->n = sin(P->sig) * cs;
- break;
- case MURD3:
- P->rho_c = del / (tan(P->sig) * tan(del)) + P->sig;
- P->rho_0 = P->rho_c - P->phi0;
- P->n = sin(P->sig) * sin(del) * tan(del) / (del * del);
- break;
- case EULER:
- P->n = sin(P->sig) * sin(del) / del;
- del *= 0.5;
- P->rho_c = del / (tan(del) * tan(P->sig)) + P->sig;
- P->rho_0 = P->rho_c - P->phi0;
- break;
- case PCONIC:
- P->n = sin(P->sig);
- P->c2 = cos(del);
- P->c1 = 1./tan(P->sig);
- if (fabs(del = P->phi0 - P->sig) - EPS10 >= HALFPI)
- E_ERROR(-43);
- P->rho_0 = P->c2 * (P->c1 - tan(del));
- break;
- case VITK1:
- P->n = (cs = tan(del)) * sin(P->sig) / del;
- P->rho_c = del / (cs * tan(P->sig)) + P->sig;
- P->rho_0 = P->rho_c - P->phi0;
- break;
- }
- P->inv = s_inverse;
- P->fwd = s_forward;
- P->es = 0;
- return (P);
-}
-ENTRY0(euler) P->type = EULER; ENDENTRY(setup(P))
-ENTRY0(tissot) P->type = TISSOT; ENDENTRY(setup(P))
-ENTRY0(murd1) P->type = MURD1; ENDENTRY(setup(P))
-ENTRY0(murd2) P->type = MURD2; ENDENTRY(setup(P))
-ENTRY0(murd3) P->type = MURD3; ENDENTRY(setup(P))
-ENTRY0(pconic) P->type = PCONIC; ENDENTRY(setup(P))
-ENTRY0(vitk1) P->type = VITK1; ENDENTRY(setup(P))
+static int phi12(PJ *P, double *del) {
+ double p1, p2;
+ int err = 0;
+
+ if (!pj_param(P->ctx, P->params, "tlat_1").i ||
+ !pj_param(P->ctx, P->params, "tlat_2").i) {
+ err = -41;
+ } else {
+ p1 = pj_param(P->ctx, P->params, "rlat_1").f;
+ p2 = pj_param(P->ctx, P->params, "rlat_2").f;
+ *del = 0.5 * (p2 - p1);
+ P->opaque->sig = 0.5 * (p2 + p1);
+ err = (fabs(*del) < EPS || fabs(P->opaque->sig) < EPS) ? -42 : 0;
+ *del = *del;
+ }
+ return err;
+}
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0, 0.0};
+ struct pj_opaque *Q = P->opaque;
+ double rho;
+
+ switch (Q->type) {
+ case MURD2:
+ rho = Q->rho_c + tan (Q->sig - lp.phi);
+ break;
+ case PCONIC:
+ rho = Q->c2 * (Q->c1 - tan (lp.phi - Q->sig));
+ break;
+ default:
+ rho = Q->rho_c - lp.phi;
+ break;
+ }
+
+ xy.x = rho * sin ( lp.lam *= Q->n );
+ xy.y = Q->rho_0 - rho * cos (lp.lam);
+ return xy;
+}
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, (and ellipsoidal?) inverse */
+ LP lp = {0.0, 0.0};
+ struct pj_opaque *Q = P->opaque;
+ double rho;
+
+ rho = hypot (xy.x, xy.y = Q->rho_0 - xy.y);
+ if (Q->n < 0.) {
+ rho = - rho;
+ xy.x = - xy.x;
+ xy.y = - xy.y;
+ }
+
+ lp.lam = atan2 (xy.x, xy.y) / Q->n;
+
+ switch (Q->type) {
+ case PCONIC:
+ lp.phi = atan (Q->c1 - rho / Q->c2) + Q->sig;
+ break;
+ case MURD2:
+ lp.phi = Q->sig - atan(rho - Q->rho_c);
+ break;
+ default:
+ lp.phi = Q->rho_c - rho;
+ }
+ 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, int type) {
+ double del, cs;
+ int i;
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+ Q->type = type;
+
+ i = phi12 (P, &del);
+ if(i)
+ E_ERROR(i);
+ switch (Q->type) {
+
+ case TISSOT:
+ Q->n = sin (Q->sig);
+ cs = cos (del);
+ Q->rho_c = Q->n / cs + cs / Q->n;
+ Q->rho_0 = sqrt ((Q->rho_c - 2 * sin (P->phi0)) / Q->n);
+ break;
+
+ case MURD1:
+ Q->rho_c = sin(del)/(del * tan(Q->sig)) + Q->sig;
+ Q->rho_0 = Q->rho_c - P->phi0;
+ Q->n = sin(Q->sig);
+ break;
+
+ case MURD2:
+ Q->rho_c = (cs = sqrt (cos (del))) / tan (Q->sig);
+ Q->rho_0 = Q->rho_c + tan (Q->sig - P->phi0);
+ Q->n = sin (Q->sig) * cs;
+ break;
+
+ case MURD3:
+ Q->rho_c = del / (tan(Q->sig) * tan(del)) + Q->sig;
+ Q->rho_0 = Q->rho_c - P->phi0;
+ Q->n = sin (Q->sig) * sin (del) * tan (del) / (del * del);
+ break;
+
+ case EULER:
+ Q->n = sin (Q->sig) * sin (del) / del;
+ del *= 0.5;
+ Q->rho_c = del / (tan (del) * tan (Q->sig)) + Q->sig;
+ Q->rho_0 = Q->rho_c - P->phi0;
+ break;
+
+ case PCONIC:
+ Q->n = sin (Q->sig);
+ Q->c2 = cos (del);
+ Q->c1 = 1./tan (Q->sig);
+ if (fabs (del = P->phi0 - Q->sig) - EPS10 >= HALFPI)
+ E_ERROR(-43);
+ Q->rho_0 = Q->c2 * (Q->c1 - tan (del));
+ break;
+
+ case VITK1:
+ Q->n = (cs = tan (del)) * sin (Q->sig) / del;
+ Q->rho_c = del / (cs * tan (Q->sig)) + Q->sig;
+ Q->rho_0 = Q->rho_c - P->phi0;
+ break;
+ }
+
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+ P->es = 0;
+ return (P);
+}
+
+
+PJ *PROJECTION(euler) {
+ return setup(P, EULER);
+}
+
+
+PJ *PROJECTION(tissot) {
+ return setup(P, TISSOT);
+}
+
+
+PJ *PROJECTION(murd1) {
+ return setup(P, MURD1);
+}
+
+
+PJ *PROJECTION(murd2) {
+ return setup(P, MURD2);
+}
+
+
+PJ *PROJECTION(murd3) {
+ return setup(P, MURD3);
+}
+
+
+PJ *PROJECTION(pconic) {
+ return setup(P, PCONIC);
+}
+
+
+PJ *PROJECTION(vitk1) {
+ return setup(P, VITK1);
+}
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_euler_selftest (void) {return 0;}
+#else
+
+int pj_euler_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=euler +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=euler +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222597.63465910763, 111404.24054991946},
+ {222767.16563187627, -111234.6764910177},
+ {-222597.63465910763, 111404.24054991946},
+ {-222767.16563187627, -111234.6764910177},
+ };
+
+ XY s_fwd_expect[] = {
+ {223360.65559869423, 111786.11238979101},
+ {223530.76769031584, -111615.96709862351},
+ {-223360.65559869423, 111786.11238979101},
+ {-223530.76769031584, -111615.96709862351},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017962807023075235, 0.0008983146697688839},
+ {0.0017962794738334226, -0.00089831589842987965},
+ {-0.0017962807023075235, 0.0008983146697688839},
+ {-0.0017962794738334226, -0.00089831589842987965},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017901444369360026, 0.00089524594522202015},
+ {0.001790143216840731, -0.00089524716533368484},
+ {-0.0017901444369360026, 0.00089524594522202015},
+ {-0.001790143216840731, -0.00089524716533368484},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_murd1_selftest (void) {return 0;}
+#else
+
+int pj_murd1_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=murd1 +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=murd1 +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222600.81347355421, 111404.24418054636},
+ {222770.3492878644, -111234.6728566746},
+ {-222600.81347355421, 111404.24418054636},
+ {-222770.3492878644, -111234.6728566746},
+ };
+
+ XY s_fwd_expect[] = {
+ {223363.84530949194, 111786.11603286299},
+ {223533.96225925098, -111615.96345182261},
+ {-223363.84530949194, 111786.11603286299},
+ {-223533.96225925098, -111615.96345182261},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017962550410516366, 0.0008983146697688839},
+ {0.0017962538125775522, -0.00089831589842987965},
+ {-0.0017962550410516366, 0.0008983146697688839},
+ {-0.0017962538125775522, -0.00089831589842987965},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017901188633413715, 0.00089524594522202015},
+ {0.0017901176432461162, -0.00089524716492657387},
+ {-0.0017901188633413715, 0.00089524594522202015},
+ {-0.0017901176432461162, -0.00089524716492657387},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_murd2_selftest (void) {return 0;}
+#else
+
+int pj_murd2_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=murd2 +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=murd2 +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222588.09975123021, 111426.14002741246},
+ {222757.72626701824, -111341.43131750476},
+ {-222588.09975123021, 111426.14002741246},
+ {-222757.72626701824, -111341.43131750476},
+ };
+
+ XY s_fwd_expect[] = {
+ {223351.08800702673, 111808.08693438848},
+ {223521.2959691704, -111723.08785967289},
+ {-223351.08800702673, 111808.08693438848},
+ {-223521.2959691704, -111723.08785967289},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017963574947305447, 0.00089788747830845382},
+ {0.0017963562661689487, -0.00089788809264252983},
+ {-0.0017963574947305447, 0.00089788747830845382},
+ {-0.0017963562661689487, -0.00089788809264252983},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017902209670287586, 0.00089482021163422854},
+ {0.0017902197468465887, -0.00089482082161134206},
+ {-0.0017902209670287586, 0.00089482021163422854},
+ {-0.0017902197468465887, -0.00089482082161134206},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_murd3_selftest (void) {return 0;}
+#else
+
+int pj_murd3_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=murd3 +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=murd3 +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222600.81407757697, 111404.24660137216},
+ {222770.35473389886, -111234.67043217793},
+ {-222600.81407757697, 111404.24660137216},
+ {-222770.35473389886, -111234.67043217793},
+ };
+
+ XY s_fwd_expect[] = {
+ {223363.84591558515, 111786.11846198692},
+ {223533.96772395336, -111615.96101901523},
+ {-223363.84591558515, 111786.11846198692},
+ {-223533.96772395336, -111615.96101901523},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017962550166583809, 0.0008983146697688839},
+ {0.0017962537881492445, -0.00089831589842987965},
+ {-0.0017962550166583809, 0.0008983146697688839},
+ {-0.0017962537881492445, -0.00089831589842987965},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017901188390313859, 0.00089524594522202015},
+ {0.0017901176189013177, -0.00089524716533368484},
+ {-0.0017901188390313859, 0.00089524594522202015},
+ {-0.0017901176189013177, -0.00089524716533368484},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_pconic_selftest (void) {return 0;}
+#else
+
+int pj_pconic_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=pconic +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=pconic +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222588.09884161691, 111416.60477006658},
+ {222757.71809109033, -111331.88153107995},
+ {-222588.09884161691, 111416.60477006658},
+ {-222757.71809109033, -111331.88153107995},
+ };
+
+ XY s_fwd_expect[] = {
+ {223351.08709429545, 111798.5189920546},
+ {223521.28776521701, -111713.50533845725},
+ {-223351.08709429545, 111798.5189920546},
+ {-223521.28776521701, -111713.50533845725},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017963575313784969, 0.0008979644089172499},
+ {0.0017963563027642206, -0.00089796502355327969},
+ {-0.0017963575313784969, 0.0008979644089172499},
+ {-0.0017963563027642206, -0.00089796502355327969},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017902210035514285, 0.0008948968793741558},
+ {0.0017902197833169374, -0.00089489748965381963},
+ {-0.0017902210035514285, 0.0008948968793741558},
+ {-0.0017902197833169374, -0.00089489748965381963},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_tissot_selftest (void) {return 0;}
+#else
+
+int pj_tissot_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=tissot +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=tissot +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222641.07869963095, 54347.828487281469},
+ {222810.61451394114, -168291.08854993948},
+ {-222641.07869963095, 54347.828487281469},
+ {-222810.61451394114, -168291.08854993948},
+ };
+
+ XY s_fwd_expect[] = {
+ {223404.24855684943, 54534.122161157939},
+ {223574.36550660848, -168867.95732352766},
+ {-223404.24855684943, 54534.122161157939},
+ {-223574.36550660848, -168867.95732352766},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017962807107425871, 0.51344495513064536},
+ {0.0017962794822333915, 0.51164832456244658},
+ {-0.0017962807107425871, 0.51344495513064536},
+ {-0.0017962794822333915, 0.51164832456244658},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017901444453421915, 0.51344188640609856},
+ {0.001790143225212064, 0.51165139329554277},
+ {-0.0017901444453421915, 0.51344188640609856},
+ {-0.001790143225212064, 0.51165139329554277},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif
+
+
+
+
+
+
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_vitk1_selftest (void) {return 0;}
+#else
+
+int pj_vitk1_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=vitk1 +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5"};
+ char s_args[] = {"+proj=vitk1 +a=6400000 +lat_1=0.5 +lat_2=2 +n=0.5"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ {222607.17121145778, 111404.25144243463},
+ {222776.71670959776, -111234.66558744459},
+ {-222607.17121145778, 111404.25144243463},
+ {-222776.71670959776, -111234.66558744459},
+ };
+
+ XY s_fwd_expect[] = {
+ {223370.22484047143, 111786.12331964359},
+ {223540.3515072545, -111615.9561576751},
+ {-223370.22484047143, 111786.12331964359},
+ {-223540.3515072545, -111615.9561576751},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ {0.0017962037198570686, 0.0008983146697688839},
+ {0.0017962024913830157, -0.00089831589842987965},
+ {-0.0017962037198570686, 0.0008983146697688839},
+ {-0.0017962024913830157, -0.00089831589842987965},
+ };
+
+ LP s_inv_expect[] = {
+ {0.0017900677174648159, 0.00089524594522202015},
+ {0.0017900664973695916, -0.00089524716533368484},
+ {-0.0017900677174648159, 0.00089524594522202015},
+ {-0.0017900664973695916, -0.00089524716533368484},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif