Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libjni-proj4 / src / PJ_labrd.c @ 21615

History | View | Annotate | Download (3.19 KB)

1
#ifndef lint
2
static const char SCCSID[]="@(#)PJ_labrd.c        4.1        94/02/15        GIE        REL";
3
#endif
4
#define PROJ_PARMS__ \
5
        double        Az, kRg, p0s, A, C, Ca, Cb, Cc, Cd; \
6
        int                rot;
7
#define PJ_LIB__
8
#include        <projects.h>
9
PROJ_HEAD(labrd, "Laborde") "\n\tCyl, Sph\n\tSpecial for Madagascar";
10
#define EPS        1.e-10
11
FORWARD(e_forward);
12
        double V1, V2, ps, sinps, cosps, sinps2, cosps2, I1, I2, I3, I4, I5, I6,
13
                x2, y2, t;
14

    
15
        V1 = P->A * log( tan(FORTPI + .5 * lp.phi) );
16
        t = P->e * sin(lp.phi);
17
        V2 = .5 * P->e * P->A * log ((1. + t)/(1. - t));
18
        ps = 2. * (atan(exp(V1 - V2 + P->C)) - FORTPI);
19
        I1 = ps - P->p0s;
20
        cosps = cos(ps);        cosps2 = cosps * cosps;
21
        sinps = sin(ps);        sinps2 = sinps * sinps;
22
        I4 = P->A * cosps;
23
        I2 = .5 * P->A * I4 * sinps;
24
        I3 = I2 * P->A * P->A * (5. * cosps2 - sinps2) / 12.;
25
        I6 = I4 * P->A * P->A;
26
        I5 = I6 * (cosps2 - sinps2) / 6.;
27
        I6 *= P->A * P->A *
28
                (5. * cosps2 * cosps2 + sinps2 * (sinps2 - 18. * cosps2)) / 120.;
29
        t = lp.lam * lp.lam;
30
        xy.x = P->kRg * lp.lam * (I4 + t * (I5 + t * I6));
31
        xy.y = P->kRg * (I1 + t * (I2 + t * I3));
32
        x2 = xy.x * xy.x;
33
        y2 = xy.y * xy.y;
34
        V1 = 3. * xy.x * y2 - xy.x * x2;
35
        V2 = xy.y * y2 - 3. * x2 * xy.y;
36
        xy.x += P->Ca * V1 + P->Cb * V2;
37
        xy.y += P->Ca * V2 - P->Cb * V1;
38
        return (xy);
39
}
40
INVERSE(e_inverse); /* ellipsoid & spheroid */
41
        double x2, y2, V1, V2, V3, V4, t, t2, ps, pe, tpe, s,
42
                I7, I8, I9, I10, I11, d, Re;
43
        int i;
44

    
45
        x2 = xy.x * xy.x;
46
        y2 = xy.y * xy.y;
47
        V1 = 3. * xy.x * y2 - xy.x * x2;
48
        V2 = xy.y * y2 - 3. * x2 * xy.y;
49
        V3 = xy.x * (5. * y2 * y2 + x2 * (-10. * y2 + x2 ));
50
        V4 = xy.y * (5. * x2 * x2 + y2 * (-10. * x2 + y2 ));
51
        xy.x += - P->Ca * V1 - P->Cb * V2 + P->Cc * V3 + P->Cd * V4;
52
        xy.y +=   P->Cb * V1 - P->Ca * V2 - P->Cd * V3 + P->Cc * V4;
53
        ps = P->p0s + xy.y / P->kRg;
54
        pe = ps + P->phi0 - P->p0s;
55
        for ( i = 20; i; --i) {
56
                V1 = P->A * log(tan(FORTPI + .5 * pe));
57
                tpe = P->e * sin(pe);
58
                V2 = .5 * P->e * P->A * log((1. + tpe)/(1. - tpe));
59
                t = ps - 2. * (atan(exp(V1 - V2 + P->C)) - FORTPI);
60
                pe += t;
61
                if (fabs(t) < EPS)
62
                        break;
63
        }
64
/*
65
        if (!i) {
66
        } else {
67
        }
68
*/
69
        t = P->e * sin(pe);
70
        t = 1. - t * t;
71
        Re = P->one_es / ( t * sqrt(t) );
72
        t = tan(ps);
73
        t2 = t * t;
74
        s = P->kRg * P->kRg;
75
        d = Re * P->k0 * P->kRg;
76
        I7 = t / (2. * d);
77
        I8 = t * (5. + 3. * t2) / (24. * d * s);
78
        d = cos(ps) * P->kRg * P->A;
79
        I9 = 1. / d;
80
        d *= s;
81
        I10 = (1. + 2. * t2) / (6. * d);
82
        I11 = (5. + t2 * (28. + 24. * t2)) / (120. * d * s);
83
        x2 = xy.x * xy.x;
84
        lp.phi = pe + x2 * (-I7 + I8 * x2);
85
        lp.lam = xy.x * (I9 + x2 * (-I10 + x2 * I11));
86
        return (lp);
87
}
88
FREEUP; if (P) pj_dalloc(P); }
89
ENTRY0(labrd)
90
        double Az, sinp, R, N, t;
91

    
92
        P->rot        = pj_param(P->params, "bno_rot").i == 0;
93
        Az = pj_param(P->params, "razi").f;
94
        sinp = sin(P->phi0);
95
        t = 1. - P->es * sinp * sinp;
96
        N = 1. / sqrt(t);
97
        R = P->one_es * N / t;
98
        P->kRg = P->k0 * sqrt( N * R );
99
        P->p0s = atan( sqrt(R / N) * tan(P->phi0) );
100
        P->A = sinp / sin(P->p0s);
101
        t = P->e * sinp;
102
        P->C = .5 * P->e * P->A * log((1. + t)/(1. - t)) +
103
                - P->A * log( tan(FORTPI + .5 * P->phi0))
104
                + log( tan(FORTPI + .5 * P->p0s));
105
        t = Az + Az;
106
        P->Ca = (1. - cos(t)) * ( P->Cb = 1. / (12. * P->kRg * P->kRg) );
107
        P->Cb *= sin(t);
108
        P->Cc = 3. * (P->Ca * P->Ca - P->Cb * P->Cb);
109
        P->Cd = 6. * P->Ca * P->Cb;
110
        P->inv = e_inverse;
111
        P->fwd = e_forward;
112
ENDENTRY(P)