Statistics
| Revision:

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

History | View | Annotate | Download (3.46 KB)

1
#ifndef lint
2
static const char SCCSID[]="@(#)PJ_robin.c        4.1 94/02/15     GIE     REL";
3
#endif
4
#define PJ_LIB__
5
#include        <projects.h>
6
PROJ_HEAD(robin, "Robinson") "\n\tPCyl., Sph.";
7
#define V(C,z) (C.c0 + z * (C.c1 + z * (C.c2 + z * C.c3)))
8
#define DV(C,z) (C.c1 + z * (C.c2 + C.c2 + z * 3. * C.c3))
9
/* note: following terms based upon 5 deg. intervals in degrees. */
10
static struct COEFS {
11
        float c0, c1, c2, c3;
12
} X[] = {
13
1,        -5.67239e-12,        -7.15511e-05,        3.11028e-06,
14
0.9986,        -0.000482241,        -2.4897e-05,        -1.33094e-06,
15
0.9954,        -0.000831031,        -4.4861e-05,        -9.86588e-07,
16
0.99,        -0.00135363,        -5.96598e-05,        3.67749e-06,
17
0.9822,        -0.00167442,        -4.4975e-06,        -5.72394e-06,
18
0.973,        -0.00214869,        -9.03565e-05,        1.88767e-08,
19
0.96,        -0.00305084,        -9.00732e-05,        1.64869e-06,
20
0.9427,        -0.00382792,        -6.53428e-05,        -2.61493e-06,
21
0.9216,        -0.00467747,        -0.000104566,        4.8122e-06,
22
0.8962,        -0.00536222,        -3.23834e-05,        -5.43445e-06,
23
0.8679,        -0.00609364,        -0.0001139,        3.32521e-06,
24
0.835,        -0.00698325,        -6.40219e-05,        9.34582e-07,
25
0.7986,        -0.00755337,        -5.00038e-05,        9.35532e-07,
26
0.7597,        -0.00798325,        -3.59716e-05,        -2.27604e-06,
27
0.7186,        -0.00851366,        -7.0112e-05,        -8.63072e-06,
28
0.6732,        -0.00986209,        -0.000199572,        1.91978e-05,
29
0.6213,        -0.010418,        8.83948e-05,        6.24031e-06,
30
0.5722,        -0.00906601,        0.000181999,        6.24033e-06,
31
0.5322, 0.,0.,0.  },
32
Y[] = {
33
0,        0.0124,        3.72529e-10,        1.15484e-09,
34
0.062,        0.0124001,        1.76951e-08,        -5.92321e-09,
35
0.124,        0.0123998,        -7.09668e-08,        2.25753e-08,
36
0.186,        0.0124008,        2.66917e-07,        -8.44523e-08,
37
0.248,        0.0123971,        -9.99682e-07,        3.15569e-07,
38
0.31,        0.0124108,        3.73349e-06,        -1.1779e-06,
39
0.372,        0.0123598,        -1.3935e-05,        4.39588e-06,
40
0.434,        0.0125501,        5.20034e-05,        -1.00051e-05,
41
0.4968,        0.0123198,        -9.80735e-05,        9.22397e-06,
42
0.5571,        0.0120308,        4.02857e-05,        -5.2901e-06,
43
0.6176,        0.0120369,        -3.90662e-05,        7.36117e-07,
44
0.6769,        0.0117015,        -2.80246e-05,        -8.54283e-07,
45
0.7346,        0.0113572,        -4.08389e-05,        -5.18524e-07,
46
0.7903,        0.0109099,        -4.86169e-05,        -1.0718e-06,
47
0.8435,        0.0103433,        -6.46934e-05,        5.36384e-09,
48
0.8936,        0.00969679,        -6.46129e-05,        -8.54894e-06,
49
0.9394,        0.00840949,        -0.000192847,        -4.21023e-06,
50
0.9761,        0.00616525,        -0.000256001,        -4.21021e-06,
51
1., 0.,0.,0 };
52
#define FXC        0.8487
53
#define FYC        1.3523
54
#define C1        11.45915590261646417544
55
#define RC1        0.08726646259971647884
56
#define NODES        18
57
#define ONEEPS        1.000001
58
#define EPS        1e-8
59
FORWARD(s_forward); /* spheroid */
60
        int i;
61
        double dphi;
62

    
63
        i = floor((dphi = fabs(lp.phi)) * C1);
64
        if (i >= NODES) i = NODES - 1;
65
        dphi = RAD_TO_DEG * (dphi - RC1 * i);
66
        xy.x = V(X[i], dphi) * FXC * lp.lam;
67
        xy.y = V(Y[i], dphi) * FYC;
68
        if (lp.phi < 0.) xy.y = -xy.y;
69
        return (xy);
70
}
71
INVERSE(s_inverse); /* spheroid */
72
        int i;
73
        double t, t1;
74
        struct COEFS T;
75

    
76
        lp.lam = xy.x / FXC;
77
        lp.phi = fabs(xy.y / FYC);
78
        if (lp.phi >= 1.) { /* simple pathologic cases */
79
                if (lp.phi > ONEEPS) I_ERROR
80
                else {
81
                        lp.phi = xy.y < 0. ? -HALFPI : HALFPI;
82
                        lp.lam /= X[NODES].c0;
83
                }
84
        } else { /* general problem */
85
                /* in Y space, reduce to table interval */
86
                for (i = floor(lp.phi * NODES);;) {
87
                        if (Y[i].c0 > lp.phi) --i;
88
                        else if (Y[i+1].c0 <= lp.phi) ++i;
89
                        else break;
90
                }
91
                T = Y[i];
92
                /* first guess, linear interp */
93
                t = 5. * (lp.phi - T.c0)/(Y[i+1].c0 - T.c0);
94
                /* make into root */
95
                T.c0 -= lp.phi;
96
                for (;;) { /* Newton-Raphson reduction */
97
                        t -= t1 = V(T,t) / DV(T,t);
98
                        if (fabs(t1) < EPS)
99
                                break;
100
                }
101
                lp.phi = (5 * i + t) * DEG_TO_RAD;
102
                if (xy.y < 0.) lp.phi = -lp.phi;
103
                lp.lam /= V(X[i], t);
104
        }
105
        return (lp);
106
}
107
FREEUP; if (P) pj_dalloc(P); }
108
ENTRY0(robin) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P)