Statistics
| Revision:

svn-gvsig-desktop / tags / v1_9_Build_1230 / libraries / libjni-proj4 / src / PJ_somerc.c @ 33666

History | View | Annotate | Download (1.89 KB)

1
#ifndef lint
2
static const char SCCSID[]="@(#)PJ_somerc.c        4.1        95/08/09        GIE        REL";
3
#endif
4
#define PROJ_PARMS__ \
5
        double        K, c, hlf_e, kR, cosp0, sinp0;
6
#define PJ_LIB__
7
#include        <projects.h>
8
PROJ_HEAD(somerc, "Swiss. Obl. Mercator") "\n\tCyl, Ell\n\tFor CH1903";
9
#define EPS        1.e-10
10
#define NITER 6
11
FORWARD(e_forward);
12
        double phip, lamp, phipp, lampp, sp, cp;
13

    
14
        sp = P->e * sin(lp.phi);
15
        phip = 2.* atan( exp( P->c * (
16
                log(tan(FORTPI + 0.5 * lp.phi)) - P->hlf_e * log((1. + sp)/(1. - sp)))
17
                + P->K)) - HALFPI;
18
        lamp = P->c * lp.lam;
19
        cp = cos(phip);
20
        phipp = aasin(P->cosp0 * sin(phip) - P->sinp0 * cp * cos(lamp));
21
        lampp = aasin(cp * sin(lamp) / cos(phipp));
22
        xy.x = P->kR * lampp;
23
        xy.y = P->kR * log(tan(FORTPI + 0.5 * phipp));
24
        return (xy);
25
}
26
INVERSE(e_inverse); /* ellipsoid & spheroid */
27
        double phip, lamp, phipp, lampp, cp, esp, con, delp;
28
        int i;
29

    
30
        phipp = 2. * (atan(exp(xy.y / P->kR)) - FORTPI);
31
        lampp = xy.x / P->kR;
32
        cp = cos(phipp);
33
        phip = aasin(P->cosp0 * sin(phipp) + P->sinp0 * cp * cos(lampp));
34
        lamp = aasin(cp * sin(lampp) / cos(phip));
35
        con = (P->K - log(tan(FORTPI + 0.5 * phip)))/P->c;
36
        for (i = NITER; i ; --i) {
37
                esp = P->e * sin(phip);
38
                delp = (con + log(tan(FORTPI + 0.5 * phip)) - P->hlf_e *
39
                        log((1. + esp)/(1. - esp)) ) *
40
                        (1. - esp * esp) * cos(phip) * P->rone_es;
41
                phip -= delp;
42
                if (fabs(delp) < EPS)
43
                        break;
44
        }
45
        if (i) {
46
                lp.phi = phip;
47
                lp.lam = lamp / P->c;
48
        } else
49
                I_ERROR
50
        return (lp);
51
}
52
FREEUP; if (P) pj_dalloc(P); }
53
ENTRY0(somerc)
54
        double cp, phip0, sp;
55

    
56
        P->hlf_e = 0.5 * P->e;
57
        cp = cos(P->phi0);
58
        cp *= cp;
59
        P->c = sqrt(1 + P->es * cp * cp * P->rone_es);
60
        sp = sin(P->phi0);
61
        P->cosp0 = cos( phip0 = aasin(P->sinp0 = sp / P->c) );
62
        sp *= P->e;
63
        P->K = log(tan(FORTPI + 0.5 * phip0)) - P->c * (
64
                log(tan(FORTPI + 0.5 * P->phi0)) - P->hlf_e *
65
                log((1. + sp) / (1. - sp)));
66
        P->kR = P->k0 * sqrt(P->one_es) / (1. - sp * sp);
67
        P->inv = e_inverse;
68
        P->fwd = e_forward;
69
ENDENTRY(P)