aboutsummaryrefslogtreecommitdiff
path: root/src/PJ_bacon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/PJ_bacon.c')
-rw-r--r--src/PJ_bacon.c180
1 files changed, 159 insertions, 21 deletions
diff --git a/src/PJ_bacon.c b/src/PJ_bacon.c
index dfc559b8..75afaeb0 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,148 @@ 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;
+
+ 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;
+
+ 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;
+
+ 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
+