Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libjni-proj4 / src / nad_cvt.c @ 7098

History | View | Annotate | Download (2.27 KB)

1
#ifndef lint
2
static const char SCCSID[]="@(#)nad_cvt.c        4.3   95/09/23 GIE REL";
3
#endif
4
#define PJ_LIB__
5
#include <projects.h>
6
#define MAX_TRY 9
7
#define TOL 1e-12
8
        LP
9
nad_cvt(LP in, int inverse, struct CTABLE *ct) {
10
        LP t, tb;
11

    
12
        if (in.lam == HUGE_VAL)
13
                return in;
14
        /* normalize input to ll origin */
15
        tb = in;
16
        tb.lam -= ct->ll.lam;
17
        tb.phi -= ct->ll.phi;
18
        tb.lam = adjlon(tb.lam - PI) + PI;
19
        t = nad_intr(tb, ct);
20
        if (inverse) {
21
                LP del, dif;
22
                int i = MAX_TRY;
23

    
24
                if (t.lam == HUGE_VAL) return t;
25
                t.lam = tb.lam + t.lam;
26
                t.phi = tb.phi - t.phi;
27

    
28
                do {
29
                        del = nad_intr(t, ct);
30

    
31
                        /* This case used to return failure, but I have
32
                           changed it to return the first order approximation
33
                           of the inverse shift.  This avoids cases where the
34
                           grid shift *into* this grid came from another grid.
35
                           While we aren't returning optimally correct results
36
                           I feel a close result in this case is better than
37
                           no result.  NFW
38
                           To demonstrate use -112.5839956 49.4914451 against
39
                           the NTv2 grid shift file from Canada. */
40
                        if (del.lam == HUGE_VAL) 
41
                        {
42
                            if( getenv( "PROJ_DEBUG" ) != NULL )
43
                                fprintf( stderr, 
44
                                         "Inverse grid shift iteration failed, presumably at grid edge.\n"
45
                                         "Using first approximation.\n" );
46
                            /* return del */;
47
                            break;
48
                        }
49

    
50
                        t.lam -= dif.lam = t.lam - del.lam - tb.lam;
51
                        t.phi -= dif.phi = t.phi + del.phi - tb.phi;
52
                } while (i-- && fabs(dif.lam) > TOL && fabs(dif.phi) > TOL);
53
                if (i < 0) {
54
                    if( getenv( "PROJ_DEBUG" ) != NULL )
55
                        fprintf( stderr, 
56
                                 "Inverse grid shift iterator failed to converge.\n" );
57
                    t.lam = t.phi = HUGE_VAL;
58
                    return t;
59
                }
60
                in.lam = adjlon(t.lam + ct->ll.lam);
61
                in.phi = t.phi + ct->ll.phi;
62
        } else {
63
                if (t.lam == HUGE_VAL)
64
                        in = t;
65
                else {
66
                        in.lam -= t.lam;
67
                        in.phi += t.phi;
68
                }
69
        }
70
        return in;
71
}