diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/PJ_comill.c | 8 | ||||
| -rw-r--r-- | src/pj_strerrno.c | 1 | ||||
| -rw-r--r-- | src/projects.h | 1 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/PJ_comill.c b/src/PJ_comill.c index c492dc95..1a4508b1 100644 --- a/src/PJ_comill.c +++ b/src/PJ_comill.c @@ -19,7 +19,8 @@ PROJ_HEAD(comill, "Compact Miller") "\n\tCyl., Sph."; #define C3 (5 * K3) #define EPS 1e-11 #define MAX_Y (0.6000207669862655 * M_PI) - +/* Not sure at all of the appropriate number for MAX_ITER... */ +#define MAX_ITER 100 static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ XY xy = {0.0,0.0}; @@ -37,6 +38,7 @@ static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ LP lp = {0.0,0.0}; double yc, tol, y2, f, fder; + int i; (void) P; /* silence unused parameter warnings */ @@ -49,7 +51,7 @@ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ /* latitude */ yc = xy.y; - for (;;) { /* Newton-Raphson */ + for (i = MAX_ITER; i ; --i) { /* Newton-Raphson */ y2 = yc * yc; f = (yc * (K1 + y2 * (K2 + K3 * y2))) - xy.y; fder = C1 + y2 * (C2 + C3 * y2); @@ -58,6 +60,8 @@ static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ break; } } + if( i == 0 ) + pj_ctx_set_errno( P->ctx, PJD_ERR_NON_CONVERGENT ); lp.phi = yc; /* longitude */ diff --git a/src/pj_strerrno.c b/src/pj_strerrno.c index 2bcdc356..5e8325c9 100644 --- a/src/pj_strerrno.c +++ b/src/pj_strerrno.c @@ -58,6 +58,7 @@ pj_err_list[] = { "malformed pipeline", /* -50 */ "unit conversion factor must be > 0", /* -51 */ "invalid scale", /* -52 */ + "non-convergent computation", /* -53 */ }; char *pj_strerrno(int err) { diff --git a/src/projects.h b/src/projects.h index 0e9f1b59..c1bf1b3a 100644 --- a/src/projects.h +++ b/src/projects.h @@ -459,6 +459,7 @@ struct FACTORS { #define PJD_ERR_GRID_AREA -48 #define PJD_ERR_CATALOG -49 #define PJD_ERR_INVALID_SCALE -52 +#define PJD_ERR_NON_CONVERGENT -53 struct projFileAPI_t; |
