aboutsummaryrefslogtreecommitdiff
path: root/src/PJ_collg.c
diff options
context:
space:
mode:
authorbusstoptaktik <knudsen.thomas@gmail.com>2016-04-14 20:42:11 +0200
committerbusstoptaktik <knudsen.thomas@gmail.com>2016-04-14 20:42:11 +0200
commit1b9f4331c65d7d98d276433cc124e667c9aa695e (patch)
treea7105be910ea67358c94a954616cd8b697da6e5d /src/PJ_collg.c
parent2f5893fa96213d5ef77328471918d2bd25645a9c (diff)
parent2d14c6a55bbc69560d71a42aec44e5cbd597ca7f (diff)
downloadPROJ-1b9f4331c65d7d98d276433cc124e667c9aa695e.tar.gz
PROJ-1b9f4331c65d7d98d276433cc124e667c9aa695e.zip
Merge pull request #3 from kbevers/fix-projections-with-c
Projections starting with the letter c refactored
Diffstat (limited to 'src/PJ_collg.c')
-rw-r--r--src/PJ_collg.c76
1 files changed, 72 insertions, 4 deletions
diff --git a/src/PJ_collg.c b/src/PJ_collg.c
index 871dfc97..80029a3a 100644
--- a/src/PJ_collg.c
+++ b/src/PJ_collg.c
@@ -1,10 +1,14 @@
#define PJ_LIB__
# include <projects.h>
+
PROJ_HEAD(collg, "Collignon") "\n\tPCyl, Sph.";
#define FXC 1.12837916709551257390
#define FYC 1.77245385090551602729
#define ONEEPS 1.0000001
-FORWARD(s_forward); /* spheroid */
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
(void) P;
if ((xy.y = 1. - sin(lp.phi)) <= 0.)
xy.y = 0.;
@@ -14,7 +18,10 @@ FORWARD(s_forward); /* spheroid */
xy.y = FYC * (1. - xy.y);
return (xy);
}
-INVERSE(s_inverse); /* spheroid */
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
+ LP lp = {0.0,0.0};
lp.phi = xy.y / FYC - 1.;
if (fabs(lp.phi = 1. - lp.phi * lp.phi) < 1.)
lp.phi = asin(lp.phi);
@@ -26,5 +33,66 @@ INVERSE(s_inverse); /* spheroid */
lp.lam = xy.x / (FXC * sqrt(lp.lam));
return (lp);
}
-FREEUP; if (P) pj_dalloc(P); }
-ENTRY0(collg) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P)
+
+
+static void *freeup_new (PJ *P) { /* Destructor */
+ return pj_dealloc(P);
+}
+
+static void freeup (PJ *P) {
+ freeup_new (P);
+ return;
+}
+
+
+PJ *PROJECTION(collg) {
+ P->es = 0.0;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_collg_selftest (void) {return 0;}
+#else
+
+int pj_collg_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=collg +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ {249872.921577929839, 99423.1747884602082},
+ {254272.532301245432, -98559.3077607425657},
+ {-249872.921577929839, 99423.1747884602082},
+ {-254272.532301245432, -98559.3077607425657},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ {0.00158679719207879865, 0.00101017310941749921},
+ {0.001586769215623956, -0.00101018201458258111},
+ {-0.00158679719207879865, 0.00101017310941749921},
+ {-0.001586769215623956, -0.00101018201458258111},
+ };
+
+ 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