aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-04-28 21:13:47 +0200
committerKristian Evers <kristianevers@gmail.com>2016-04-28 21:13:47 +0200
commit47a7800d0396d36dbb099e9a4a86378f5bb4a1dd (patch)
treef9cfc6aa422b9817bbd9147a131c2525311b69e4 /src
parent66b9152c5339cdc699c93d8954078e1a81f84e38 (diff)
downloadPROJ-47a7800d0396d36dbb099e9a4a86378f5bb4a1dd.tar.gz
PROJ-47a7800d0396d36dbb099e9a4a86378f5bb4a1dd.zip
Converted mbtfpp
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c1
-rw-r--r--src/PJ_mbtfpp.c139
2 files changed, 110 insertions, 30 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 4198d2b3..863d9025 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -369,7 +369,6 @@ int pj_longlat_selftest (void) {return 10000;}
int pj_lee_os_selftest (void) {return 10000;}
-int pj_mbtfpp_selftest (void) {return 10000;}
int pj_mbtfpq_selftest (void) {return 10000;}
int pj_merc_selftest (void) {return 10000;}
int pj_mil_os_selftest (void) {return 10000;}
diff --git a/src/PJ_mbtfpp.c b/src/PJ_mbtfpp.c
index 433d3c8f..688150fe 100644
--- a/src/PJ_mbtfpp.c
+++ b/src/PJ_mbtfpp.c
@@ -1,33 +1,114 @@
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
PROJ_HEAD(mbtfpp, "McBride-Thomas Flat-Polar Parabolic") "\n\tCyl., Sph.";
-#define CS .95257934441568037152
-#define FXC .92582009977255146156
-#define FYC 3.40168025708304504493
-#define C23 .66666666666666666666
-#define C13 .33333333333333333333
-#define ONEEPS 1.0000001
-FORWARD(s_forward); /* spheroid */
- (void) P;
- lp.phi = asin(CS * sin(lp.phi));
- xy.x = FXC * lp.lam * (2. * cos(C23 * lp.phi) - 1.);
- xy.y = FYC * sin(C13 * lp.phi);
- return (xy);
+
+#define CS .95257934441568037152
+#define FXC .92582009977255146156
+#define FYC 3.40168025708304504493
+#define C23 .66666666666666666666
+#define C13 .33333333333333333333
+#define ONEEPS 1.0000001
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
+ (void) P;
+
+ lp.phi = asin(CS * sin(lp.phi));
+ xy.x = FXC * lp.lam * (2. * cos(C23 * lp.phi) - 1.);
+ xy.y = FYC * sin(C13 * lp.phi);
+ return xy;
}
-INVERSE(s_inverse); /* spheroid */
- lp.phi = xy.y / FYC;
- if (fabs(lp.phi) >= 1.) {
- if (fabs(lp.phi) > ONEEPS) I_ERROR
- else lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI;
- } else
- lp.phi = asin(lp.phi);
- lp.lam = xy.x / ( FXC * (2. * cos(C23 * (lp.phi *= 3.)) - 1.) );
- if (fabs(lp.phi = sin(lp.phi) / CS) >= 1.) {
- if (fabs(lp.phi) > ONEEPS) I_ERROR
- else lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI;
- } else
- lp.phi = asin(lp.phi);
- return (lp);
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
+ LP lp = {0.0,0.0};
+
+ lp.phi = xy.y / FYC;
+ if (fabs(lp.phi) >= 1.) {
+ if (fabs(lp.phi) > ONEEPS)
+ I_ERROR
+ else
+ lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI;
+ } else
+ lp.phi = asin(lp.phi);
+
+ lp.lam = xy.x / ( FXC * (2. * cos(C23 * (lp.phi *= 3.)) - 1.) );
+ if (fabs(lp.phi = sin(lp.phi) / CS) >= 1.) {
+ if (fabs(lp.phi) > ONEEPS)
+ I_ERROR
+ else
+ lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI;
+ } else
+ lp.phi = asin(lp.phi);
+
+ return lp;
}
-FREEUP; if (P) pj_dalloc(P); }
-ENTRY0(mbtfpp) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P)
+
+
+static void *freeup_new (PJ *P) { /* Destructor */
+ if (0==P)
+ return 0;
+
+ return pj_dealloc(P);
+}
+
+static void freeup (PJ *P) {
+ freeup_new (P);
+ return;
+}
+
+
+PJ *PROJECTION(mbtfpp) {
+
+ P->es = 0.;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_mbtfpp_selftest (void) {return 0;}
+#else
+
+int pj_mbtfpp_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=mbtfpp +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ {206804.786929820373, 120649.762565792524},
+ {206804.786929820373, -120649.762565792524},
+ {-206804.786929820373, 120649.762565792524},
+ {-206804.786929820373, -120649.762565792524},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ {0.00193395359462902698, 0.00082883725477665357},
+ {0.00193395359462902698, -0.00082883725477665357},
+ {-0.00193395359462902698, 0.00082883725477665357},
+ {-0.00193395359462902698, -0.00082883725477665357},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
+}
+
+
+#endif