aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2018-05-05 09:52:34 +0300
committerGitHub <noreply@github.com>2018-05-05 09:52:34 +0300
commit6605ac6709dda2bd1df7f3c2d589d5b16ed42df7 (patch)
tree02d0bbae463d6fdb1434d7fe63e46c69965c3e5d /src
parent8dcdf567311a7f088ab538f41a0e947b825ce75d (diff)
parent8e53bdeae08ef8c1a2f0dbf4921b8aa7cc41aa41 (diff)
downloadPROJ-6605ac6709dda2bd1df7f3c2d589d5b16ed42df7.tar.gz
PROJ-6605ac6709dda2bd1df7f3c2d589d5b16ed42df7.zip
Merge pull request #973 from schwehr/pj_phi2_simple
Minor cleanup of pj_phi2.c
Diffstat (limited to 'src')
-rw-r--r--src/pj_phi2.c64
1 files changed, 41 insertions, 23 deletions
diff --git a/src/pj_phi2.c b/src/pj_phi2.c
index 13419df8..a83302e6 100644
--- a/src/pj_phi2.c
+++ b/src/pj_phi2.c
@@ -1,28 +1,46 @@
-/* determine latitude angle phi-2 */
+/* Determine latitude angle phi-2. */
+
+#include <math.h>
+
#include "projects.h"
-#define TOL 1.0e-10
-#define N_ITER 15
+static const double TOL = 1.0e-10;
+static const int N_ITER = 15;
+
+/*****************************************************************************/
+double pj_phi2(projCtx ctx, double ts, double e) {
+/******************************************************************************
+Determine latitude angle phi-2.
+Inputs:
+ ts = exp(-psi) where psi is the isometric latitude (dimensionless)
+ e = eccentricity of the ellipsoid (dimensionless)
+Output:
+ phi = geographic latitude (radians)
+Here isometric latitude is defined by
+ psi = log( tan(pi/4 + phi/2) *
+ ( (1 - e*sin(phi)) / (1 + e*sin(phi)) )^(e/2) )
+ = asinh(tan(phi)) - e * atanh(e * sin(phi))
+This routine inverts this relation using the iterative scheme given
+by Snyder (1987), Eqs. (7-9) - (7-11)
+*******************************************************************************/
+ double eccnth = .5 * e;
+ double Phi = M_HALFPI - 2. * atan(ts);
+ double con;
+ int i = N_ITER;
+
+ for(;;) {
+ double dphi;
+ con = e * sin(Phi);
+ dphi = M_HALFPI - 2. * atan(ts * pow((1. - con) /
+ (1. + con), eccnth)) - Phi;
- double
-pj_phi2(projCtx ctx, double ts, double e) {
- double eccnth, Phi, con;
- int i;
+ Phi += dphi;
- eccnth = .5 * e;
- Phi = M_HALFPI - 2. * atan (ts);
- i = N_ITER;
- for(;;) {
- double dphi;
- con = e * sin (Phi);
- dphi = M_HALFPI - 2. * atan (ts * pow((1. - con) /
- (1. + con), eccnth)) - Phi;
- Phi += dphi;
- if( fabs(dphi) > TOL && --i )
- continue;
- break;
- }
- if (i <= 0)
- pj_ctx_set_errno( ctx, PJD_ERR_NON_CON_INV_PHI2 );
- return Phi;
+ if (fabs(dphi) > TOL && --i)
+ continue;
+ break;
+ }
+ if (i <= 0)
+ pj_ctx_set_errno(ctx, PJD_ERR_NON_CON_INV_PHI2);
+ return Phi;
}