Statistics
| Revision:

svn-gvsig-desktop / tags / v1_1_2_Build_1045 / libraries / libjni-proj4 / src / geod_for.c @ 38629

History | View | Annotate | Download (2.2 KB)

1
#ifndef lint
2
static const char SCCSID[]="@(#)geod_for.c        4.6        95/09/23        GIE        REL";
3
#endif
4
# include "projects.h"
5
# include "geodesic.h"
6
# define MERI_TOL 1e-9
7
        static double
8
th1,costh1,sinth1,sina12,cosa12,M,N,c1,c2,D,P,s1;
9
        static int
10
merid, signS;
11
        void
12
geod_pre(void) {
13
        al12 = adjlon(al12); /* reduce to  +- 0-PI */
14
        signS = fabs(al12) > HALFPI ? 1 : 0;
15
        th1 = ellipse ? atan(onef * tan(phi1)) : phi1;
16
        costh1 = cos(th1);
17
        sinth1 = sin(th1);
18
        if ((merid = fabs(sina12 = sin(al12)) < MERI_TOL)) {
19
                sina12 = 0.;
20
                cosa12 = fabs(al12) < HALFPI ? 1. : -1.;
21
                M = 0.;
22
        } else {
23
                cosa12 = cos(al12);
24
                M = costh1 * sina12;
25
        }
26
        N = costh1 * cosa12;
27
        if (ellipse) {
28
                if (merid) {
29
                        c1 = 0.;
30
                        c2 = f4;
31
                        D = 1. - c2;
32
                        D *= D;
33
                        P = c2 / D;
34
                } else {
35
                        c1 = geod_f * M;
36
                        c2 = f4 * (1. - M * M);
37
                        D = (1. - c2)*(1. - c2 - c1 * M);
38
                        P = (1. + .5 * c1 * M) * c2 / D;
39
                }
40
        }
41
        if (merid) s1 = HALFPI - th1;
42
        else {
43
                s1 = (fabs(M) >= 1.) ? 0. : acos(M);
44
                s1 =  sinth1 / sin(s1);
45
                s1 = (fabs(s1) >= 1.) ? 0. : acos(s1);
46
        }
47
}
48
        void
49
geod_for(void) {
50
        double d,sind,u,V,X,ds,cosds,sinds,ss,de;
51

    
52
        if (ellipse) {
53
                d = geod_S / (D * geod_a);
54
                if (signS) d = -d;
55
                u = 2. * (s1 - d);
56
                V = cos(u + d);
57
                X = c2 * c2 * (sind = sin(d)) * cos(d) * (2. * V * V - 1.);
58
                ds = d + X - 2. * P * V * (1. - 2. * P * cos(u)) * sind;
59
                ss = s1 + s1 - ds;
60
        } else {
61
                ds = geod_S / geod_a;
62
                if (signS) ds = - ds;
63
        }
64
        cosds = cos(ds);
65
        sinds = sin(ds);
66
        if (signS) sinds = - sinds;
67
        al21 = N * cosds - sinth1 * sinds;
68
        if (merid) {
69
                phi2 = atan( tan(HALFPI + s1 - ds) / onef);
70
                if (al21 > 0.) {
71
                        al21 = PI;
72
                        if (signS)
73
                                de = PI;
74
                        else {
75
                                phi2 = - phi2;
76
                                de = 0.;
77
                        }
78
                } else {
79
                        al21 = 0.;
80
                        if (signS) {
81
                                phi2 = - phi2;
82
                                de = 0;
83
                        } else
84
                                de = PI;
85
                }
86
        } else {
87
                al21 = atan(M / al21);
88
                if (al21 > 0)
89
                        al21 += PI;
90
                if (al12 < 0.)
91
                        al21 -= PI;
92
                al21 = adjlon(al21);
93
                phi2 = atan(-(sinth1 * cosds + N * sinds) * sin(al21) /
94
                        (ellipse ? onef * M : M));
95
                de = atan2(sinds * sina12 ,
96
                        (costh1 * cosds - sinth1 * sinds * cosa12));
97
                if (ellipse)
98
                        if (signS)
99
                                de += c1 * ((1. - c2) * ds +
100
                                        c2 * sinds * cos(ss));
101
                        else
102
                                de -= c1 * ((1. - c2) * ds -
103
                                        c2 * sinds * cos(ss));
104
        }
105
        lam2 = adjlon( lam1 + de );
106
}