diff options
| author | Kristian Evers <kristianevers@gmail.com> | 2016-05-04 10:21:00 +0200 |
|---|---|---|
| committer | Kristian Evers <kristianevers@gmail.com> | 2016-05-04 10:21:00 +0200 |
| commit | 80cfc0386a19ceda105beb86f25bed26450c08e5 (patch) | |
| tree | 575fb20006c517557caebf97cb5836b027dbb15c /src | |
| parent | 430534766d41a5a51c448c3d2c60e9467305d60f (diff) | |
| download | PROJ-80cfc0386a19ceda105beb86f25bed26450c08e5.tar.gz PROJ-80cfc0386a19ceda105beb86f25bed26450c08e5.zip | |
Converted vandg2 and vandg3
Diffstat (limited to 'src')
| -rw-r--r-- | src/PJ_aea.c | 2 | ||||
| -rw-r--r-- | src/PJ_vandg2.c | 186 |
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 |
