aboutsummaryrefslogtreecommitdiff
path: root/src/PJ_bacon.c
diff options
context:
space:
mode:
authorThomas Knudsen <lastname DOT firstname AT gmail DOT com>2016-04-05 23:56:01 +0200
committerThomas Knudsen <lastname DOT firstname AT gmail DOT com>2016-04-05 23:56:01 +0200
commit77f8c2947b934d64293da614bf7b8b8e0f90031b (patch)
treeae767e1a7213ff8882f7910e84489a785506fc90 /src/PJ_bacon.c
parent2cd5e4f988e7f2d89f259ad2f3ac69be825acb75 (diff)
downloadPROJ-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.c186
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
+