aboutsummaryrefslogtreecommitdiff
path: root/src/projections/stere.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/projections/stere.cpp')
-rw-r--r--src/projections/stere.cpp35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/projections/stere.cpp b/src/projections/stere.cpp
index 9b24a596..683d484c 100644
--- a/src/projections/stere.cpp
+++ b/src/projections/stere.cpp
@@ -41,7 +41,7 @@ static double ssfn_ (double phit, double sinphi, double eccen) {
}
-static PJ_XY e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward */
+static PJ_XY stere_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward */
PJ_XY xy = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
double coslam, sinlam, sinX = 0.0, cosX = 0.0, X, A = 0.0, sinphi;
@@ -55,11 +55,18 @@ static PJ_XY e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward */
}
switch (Q->mode) {
- case OBLIQ:
- A = Q->akm1 / (Q->cosX1 * (1. + Q->sinX1 * sinX +
- Q->cosX1 * cosX * coslam));
+ case OBLIQ: {
+ const double denom = Q->cosX1 * (1. + Q->sinX1 * sinX +
+ Q->cosX1 * cosX * coslam);
+ if( denom == 0 ) {
+ proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION);
+ return proj_coord_error().xy;
+ }
+ A = Q->akm1 / denom;
xy.y = A * (Q->cosX1 * sinX - Q->sinX1 * cosX * coslam);
- goto xmul; /* but why not just xy.x = A * cosX; break; ? */
+ xy.x = A * cosX;
+ break;
+ }
case EQUIT:
/* avoid zero division */
@@ -69,7 +76,6 @@ static PJ_XY e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward */
A = Q->akm1 / (1. + cosX * coslam);
xy.y = A * sinX;
}
-xmul:
xy.x = A * cosX;
break;
@@ -89,7 +95,7 @@ xmul:
}
-static PJ_XY s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward */
+static PJ_XY stere_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward */
PJ_XY xy = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
double sinphi, cosphi, coslam, sinlam;
@@ -131,7 +137,7 @@ oblcon:
}
-static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
+static PJ_LP stere_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
PJ_LP lp = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
double cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, halfpi=0.0;
@@ -165,7 +171,7 @@ static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
break;
}
- for (i = NITER; i--; phi_l = lp.phi) {
+ for (i = NITER; i--; ) {
sinphi = P->e * sin(phi_l);
lp.phi = 2. * atan (tp * pow ((1.+sinphi)/(1.-sinphi), halfe)) - halfpi;
if (fabs (phi_l - lp.phi) < CONV) {
@@ -174,6 +180,7 @@ static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
lp.lam = (xy.x == 0. && xy.y == 0.) ? 0. : atan2 (xy.x, xy.y);
return lp;
}
+ phi_l = lp.phi;
}
proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION);
@@ -181,7 +188,7 @@ static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse */
}
-static PJ_LP s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse */
+static PJ_LP stere_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse */
PJ_LP lp = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
double c, rh, sinc, cosc;
@@ -258,8 +265,8 @@ static PJ *setup(PJ *P) { /* general initialization */
Q->cosX1 = cos (X);
break;
}
- P->inv = e_inverse;
- P->fwd = e_forward;
+ P->inv = stere_e_inverse;
+ P->fwd = stere_e_forward;
} else {
switch (Q->mode) {
case OBLIQ:
@@ -277,8 +284,8 @@ static PJ *setup(PJ *P) { /* general initialization */
break;
}
- P->inv = s_inverse;
- P->fwd = s_forward;
+ P->inv = stere_s_inverse;
+ P->fwd = stere_s_forward;
}
return P;
}