aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-05-04 10:21:00 +0200
committerKristian Evers <kristianevers@gmail.com>2016-05-04 10:21:00 +0200
commit80cfc0386a19ceda105beb86f25bed26450c08e5 (patch)
tree575fb20006c517557caebf97cb5836b027dbb15c /src
parent430534766d41a5a51c448c3d2c60e9467305d60f (diff)
downloadPROJ-80cfc0386a19ceda105beb86f25bed26450c08e5.tar.gz
PROJ-80cfc0386a19ceda105beb86f25bed26450c08e5.zip
Converted vandg2 and vandg3
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c2
-rw-r--r--src/PJ_vandg2.c186
2 files changed, 145 insertions, 43 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index a65c148f..69b5bfe3 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -367,7 +367,5 @@ int pj_rouss_selftest (void) {return 10000;}
int pj_sch_selftest (void) {return 10000;}
int pj_utm_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;}
#endif
diff --git a/src/PJ_vandg2.c b/src/PJ_vandg2.c
index 7bfa8f4e..f8850cad 100644
--- a/src/PJ_vandg2.c
+++ b/src/PJ_vandg2.c
@@ -1,45 +1,149 @@
-# define TOL 1e-10
-# define TWORPI 0.63661977236758134308
-#define PROJ_PARMS__ \
- int vdg3;
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
+struct pj_opaque {
+ int vdg3;
+};
+
PROJ_HEAD(vandg2, "van der Grinten II") "\n\tMisc Sph, no inv.";
PROJ_HEAD(vandg3, "van der Grinten III") "\n\tMisc Sph, no inv.";
-FORWARD(s_forward); /* spheroid */
- double x1, at, bt, ct;
-
- bt = fabs(TWORPI * lp.phi);
- if ((ct = 1. - bt * bt) < 0.)
- ct = 0.;
- else
- ct = sqrt(ct);
- if (fabs(lp.lam) < TOL) {
- xy.x = 0.;
- xy.y = PI * (lp.phi < 0. ? -bt : bt) / (1. + ct);
- } else {
- at = 0.5 * fabs(PI / lp.lam - lp.lam / PI);
- if (P->vdg3) {
- x1 = bt / (1. + ct);
- xy.x = PI * (sqrt(at * at + 1. - x1 * x1) - at);
- xy.y = PI * x1;
- } else {
- x1 = (ct * sqrt(1. + at * at) - at * ct * ct) /
- (1. + at * at * bt * bt);
- xy.x = PI * x1;
- xy.y = PI * sqrt(1. - x1 * (x1 + 2. * at) + TOL);
- }
- if ( lp.lam < 0.) xy.x = -xy.x;
- if ( lp.phi < 0.) xy.y = -xy.y;
- }
- return (xy);
+
+#define TOL 1e-10
+#define TWORPI 0.63661977236758134308
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
+ struct pj_opaque *Q = P->opaque;
+ double x1, at, bt, ct;
+
+ bt = fabs(TWORPI * lp.phi);
+ if ((ct = 1. - bt * bt) < 0.)
+ ct = 0.;
+ else
+ ct = sqrt(ct);
+ if (fabs(lp.lam) < TOL) {
+ xy.x = 0.;
+ xy.y = PI * (lp.phi < 0. ? -bt : bt) / (1. + ct);
+ } else {
+ at = 0.5 * fabs(PI / lp.lam - lp.lam / PI);
+ if (Q->vdg3) {
+ x1 = bt / (1. + ct);
+ xy.x = PI * (sqrt(at * at + 1. - x1 * x1) - at);
+ xy.y = PI * x1;
+ } else {
+ x1 = (ct * sqrt(1. + at * at) - at * ct * ct) /
+ (1. + at * at * bt * bt);
+ xy.x = PI * x1;
+ xy.y = PI * sqrt(1. - x1 * (x1 + 2. * at) + TOL);
+ }
+ if ( lp.lam < 0.) xy.x = -xy.x;
+ if ( lp.phi < 0.) xy.y = -xy.y;
+ }
+
+ return xy;
+}
+
+
+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(vandg2) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ Q->vdg3 = 0;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+PJ *PROJECTION(vandg3) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return freeup_new (P);
+ P->opaque = Q;
+
+ Q->vdg3 = 1;
+ P->es = 0.;
+ P->fwd = s_forward;
+
+ return P;
}
-FREEUP; if (P) pj_dalloc(P); }
-ENTRY0(vandg2)
- P->vdg3 = 0;
- P->inv = 0; P->fwd = s_forward;
-ENDENTRY(P)
-ENTRY0(vandg3)
- P->vdg3 = 1;
- P->es = 0.; P->fwd = s_forward;
-ENDENTRY(P)
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_vandg2_selftest (void) {return 0;}
+#else
+
+int pj_vandg2_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=vandg2 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 223395.24785043663, 111718.49103722633},
+ { 223395.24785043663, -111718.49103722633},
+ {-223395.24785043663, 111718.49103722633},
+ {-223395.24785043663, -111718.49103722633},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, 0, 0, 0);
+}
+
+
+#endif
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_vandg3_selftest (void) {return 0;}
+#else
+
+int pj_vandg3_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=vandg3 +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ { 223395.24955283134, 111704.51990442065},
+ { 223395.24955283134, -111704.51990442065},
+ {-223395.24955283134, 111704.51990442065},
+ {-223395.24955283134, -111704.51990442065},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, 0, 0, 0);
+}
+
+
+#endif