diff options
| author | Thomas Knudsen <lastname DOT firstname AT gmail DOT com> | 2016-04-05 23:56:01 +0200 |
|---|---|---|
| committer | Thomas Knudsen <lastname DOT firstname AT gmail DOT com> | 2016-04-05 23:56:01 +0200 |
| commit | 77f8c2947b934d64293da614bf7b8b8e0f90031b (patch) | |
| tree | ae767e1a7213ff8882f7910e84489a785506fc90 /src/PJ_bacon.c | |
| parent | 2cd5e4f988e7f2d89f259ad2f3ac69be825acb75 (diff) | |
| download | PROJ-77f8c2947b934d64293da614bf7b8b8e0f90031b.tar.gz PROJ-77f8c2947b934d64293da614bf7b8b8e0f90031b.zip | |
Added regression tests for projections beginning with a and b
Continuing alphabetically, with a few detours due to the occasional case
of more than one projection in one source file.
Diffstat (limited to 'src/PJ_bacon.c')
| -rw-r--r-- | src/PJ_bacon.c | 186 |
1 files changed, 165 insertions, 21 deletions
diff --git a/src/PJ_bacon.c b/src/PJ_bacon.c index dfc559b8..b71fae28 100644 --- a/src/PJ_bacon.c +++ b/src/PJ_bacon.c @@ -1,19 +1,27 @@ # define HLFPI2 2.46740110027233965467 # define EPS 1e-10 -#define PROJ_PARMS__ \ - int bacn; \ - int ortl; #define PJ_LIB__ #include <projects.h> + + +struct pj_opaque { + int bacn; + int ortl; +}; + PROJ_HEAD(apian, "Apian Globular I") "\n\tMisc Sph, no inv."; PROJ_HEAD(ortel, "Ortelius Oval") "\n\tMisc Sph, no inv."; PROJ_HEAD(bacon, "Bacon Globular") "\n\tMisc Sph, no inv."; -FORWARD(s_forward); /* spheroid */ + + +static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ + XY xy = {0.0,0.0}; + struct pj_opaque *Q = P->opaque; double ax, f; - xy.y = P->bacn ? HALFPI * sin(lp.phi) : lp.phi; + xy.y = Q->bacn ? HALFPI * sin(lp.phi) : lp.phi; if ((ax = fabs(lp.lam)) >= EPS) { - if (P->ortl && ax >= HALFPI) + if (Q->ortl && ax >= HALFPI) xy.x = sqrt(HLFPI2 - lp.phi * lp.phi + EPS) + ax - HALFPI; else { f = 0.5 * (HLFPI2 / ax + ax); @@ -24,18 +32,154 @@ FORWARD(s_forward); /* spheroid */ xy.x = 0.; return (xy); } -FREEUP; if (P) pj_dalloc(P); } -ENTRY0(bacon) - P->bacn = 1; - P->ortl = 0; - P->es = 0.; P->fwd = s_forward; -ENDENTRY(P) -ENTRY0(apian) - P->bacn = P->ortl = 0; - P->es = 0.; P->fwd = s_forward; -ENDENTRY(P) -ENTRY0(ortel) - P->bacn = 0; - P->ortl = 1; - P->es = 0.; P->fwd = s_forward; -ENDENTRY(P) + + +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(bacon) { + struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque)); + if (0==Q) + return freeup_new (P); + P->opaque = Q; + + P->pfree = freeup; + P->descr = des_bacon; + Q->bacn = 1; + Q->ortl = 0; + P->es = 0.; + P->fwd = s_forward; + return P; +} + + +PJ *PROJECTION(apian) { + struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque)); + if (0==Q) + return freeup_new (P); + P->opaque = Q; + + P->pfree = freeup; + P->descr = des_apian; + Q->bacn = Q->ortl = 0; + P->es = 0.; + P->fwd = s_forward; + return P; +} + + +PJ *PROJECTION(ortel) { + struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque)); + if (0==Q) + return freeup_new (P); + P->opaque = Q; + + P->pfree = freeup; + P->descr = des_ortel; + Q->bacn = 0; + Q->ortl = 1; + P->es = 0.; + P->fwd = s_forward; + return P; +} + + +#ifdef PJ_OMIT_SELFTEST +int pj_bacon_selftest (void) {return 0;} +#else +int pj_bacon_selftest (void) { + double tolerance_lp = 1e-10; + double tolerance_xy = 1e-7; + + char s_args[] = {"+proj=bacon +a=6400000 +lat_1=0 +lat_2=2"}; + + LP fwd_in[] = { + { 2, 1}, + { 2,-1}, + {-2, 1}, + {-2,-1} + }; + + XY s_fwd_expect[] = { + {223334.13255596498, 175450.72592266591}, + {223334.13255596498, -175450.72592266591}, + {-223334.13255596498, 175450.72592266591}, + {-223334.13255596498, -175450.72592266591}, + }; + + return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 0, fwd_in, 0, s_fwd_expect, 0, 0, 0); +} +#endif + + + + +#ifdef PJ_OMIT_SELFTEST +int pj_apian_selftest (void) {return 0;} +#else +int pj_apian_selftest (void) { + double tolerance_lp = 1e-10; + double tolerance_xy = 1e-7; + + char s_args[] = {"+proj=apian +a=6400000 +lat_1=0 +lat_2=2"}; + + LP fwd_in[] = { + { 2, 1}, + { 2,-1}, + {-2, 1}, + {-2,-1} + }; + + XY s_fwd_expect[] = { + { 223374.57735525275, 111701.07212763709}, + { 223374.57735525275, -111701.07212763709}, + {-223374.57735525275, 111701.07212763709}, + {-223374.57735525275, -111701.07212763709}, + }; + + return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 0, fwd_in, 0, s_fwd_expect, 0, 0, 0); +} +#endif + + + + +#ifdef PJ_OMIT_SELFTEST +int pj_ortel_selftest (void) {return 0;} +#else +int pj_ortel_selftest (void) { + double tolerance_lp = 1e-10; + double tolerance_xy = 1e-7; + + char s_args[] = {"+proj=ortel +a=6400000 +lat_1=0 +lat_2=2"}; + + LP fwd_in[] = { + { 2, 1}, + { 2,-1}, + {-2, 1}, + {-2,-1} + }; + + XY s_fwd_expect[] = { + { 223374.57735525275, 111701.07212763709}, + { 223374.57735525275, -111701.07212763709}, + {-223374.57735525275, 111701.07212763709}, + {-223374.57735525275, -111701.07212763709}, + }; + return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 0, fwd_in, 0, s_fwd_expect, 0, 0, 0); +} +#endif + |
