diff options
| author | Frank Warmerdam <warmerdam@pobox.com> | 2012-02-01 23:03:34 +0000 |
|---|---|---|
| committer | Frank Warmerdam <warmerdam@pobox.com> | 2012-02-01 23:03:34 +0000 |
| commit | faffa62c5414cf9d97e3d7d889ffa60657135129 (patch) | |
| tree | a9e8416d60d9ad73af1ca36bd70d2d5784302d47 /src/pj_apply_gridshift.c | |
| parent | dde549f375520ca0a752cb4699ebc1791746d286 (diff) | |
| download | PROJ-faffa62c5414cf9d97e3d7d889ffa60657135129.tar.gz PROJ-faffa62c5414cf9d97e3d7d889ffa60657135129.zip | |
ensure pj_apply_gridshift() supports points up to epsilon outside mesh (#141)
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@2152 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src/pj_apply_gridshift.c')
| -rw-r--r-- | src/pj_apply_gridshift.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/pj_apply_gridshift.c b/src/pj_apply_gridshift.c index 16f59767..366026db 100644 --- a/src/pj_apply_gridshift.c +++ b/src/pj_apply_gridshift.c @@ -140,11 +140,15 @@ int pj_apply_gridshift_3( projCtx ctx, PJ_GRIDINFO **tables, int grid_count, { PJ_GRIDINFO *gi = tables[itable]; struct CTABLE *ct = gi->ct; + double epsilon = (fabs(ct->del.phi)+fabs(ct->del.lam))/10000.0; /* skip tables that don't match our point at all. */ - if( ct->ll.phi > input.phi || ct->ll.lam > input.lam - || ct->ll.phi + (ct->lim.phi-1) * ct->del.phi < input.phi - || ct->ll.lam + (ct->lim.lam-1) * ct->del.lam < input.lam ) + if( ct->ll.phi - epsilon > input.phi + || ct->ll.lam - epsilon > input.lam + || (ct->ll.phi + (ct->lim.phi-1) * ct->del.phi + epsilon + < input.phi) + || (ct->ll.lam + (ct->lim.lam-1) * ct->del.lam + epsilon + < input.lam) ) continue; /* If we have child nodes, check to see if any of them apply. */ @@ -155,10 +159,15 @@ int pj_apply_gridshift_3( projCtx ctx, PJ_GRIDINFO **tables, int grid_count, for( child = gi->child; child != NULL; child = child->next ) { struct CTABLE *ct1 = child->ct; - - if( ct1->ll.phi > input.phi || ct1->ll.lam > input.lam - || ct1->ll.phi+(ct1->lim.phi-1)*ct1->del.phi < input.phi - || ct1->ll.lam+(ct1->lim.lam-1)*ct1->del.lam < input.lam) + double epsilon = + (fabs(ct1->del.phi)+fabs(ct1->del.lam))/10000.0; + + if( ct1->ll.phi - epsilon > input.phi + || ct1->ll.lam - epsilon > input.lam + || (ct1->ll.phi+(ct1->lim.phi-1)*ct1->del.phi + epsilon + < input.phi) + || (ct1->ll.lam+(ct1->lim.lam-1)*ct1->del.lam + epsilon + < input.lam) ) continue; break; |
