Statistics
| Revision:

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

History | View | Annotate | Download (2.93 KB)

1
/*
2
** libproj -- library of cartographic projections
3
**
4
** Copyright (c) 2003   Gerald I. Evenden
5
*/
6
static const char
7
LIBPROJ_ID[] = "$Id: pj_gauss.c,v 1.1 2004/10/20 17:04:00 fwarmerdam Exp $";
8
/*
9
** Permission is hereby granted, free of charge, to any person obtaining
10
** a copy of this software and associated documentation files (the
11
** "Software"), to deal in the Software without restriction, including
12
** without limitation the rights to use, copy, modify, merge, publish,
13
** distribute, sublicense, and/or sell copies of the Software, and to
14
** permit persons to whom the Software is furnished to do so, subject to
15
** the following conditions:
16
**
17
** The above copyright notice and this permission notice shall be
18
** included in all copies or substantial portions of the Software.
19
**
20
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26
** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
*/
28
#define PJ_LIB__
29
#include <projects.h>
30

    
31
#define MAX_ITER 20
32

    
33
struct GAUSS {
34
        double C;
35
        double K;
36
        double e;
37
        double ratexp;
38
};
39
#define EN ((struct GAUSS *)en)
40
#define DEL_TOL 1e-14
41
        static double
42
srat(double esinp, double exp) {
43
        return(pow((1.-esinp)/(1.+esinp), exp));
44
}
45

    
46
        void *
47
pj_gauss_ini(double e, double phi0, double *chi, double *rc) {
48
        double sphi, cphi, es;
49
        struct GAUSS *en;
50

    
51
        if ((en = (struct GAUSS *)malloc(sizeof(struct GAUSS))) == NULL)
52
                return (NULL);
53
        es = e * e;
54
        EN->e = e;
55
        sphi = sin(phi0);
56
        cphi = cos(phi0);  cphi *= cphi;
57
        *rc = sqrt(1. - es) / (1. - es * sphi * sphi);
58
        EN->C = sqrt(1. + es * cphi * cphi / (1. - es));
59
        *chi = asin(sphi / EN->C);
60
        EN->ratexp = 0.5 * EN->C * e;
61
        EN->K = tan(.5 * *chi + FORTPI) / (
62
                pow(tan(.5 * phi0 + FORTPI), EN->C) *
63
                srat(EN->e * sphi, EN->ratexp)  );
64
        return ((void *)en);
65
}
66
        LP
67
pj_gauss(LP elp, const void *en) {
68
        LP slp;
69

    
70
        slp.phi = 2. * atan( EN->K *
71
                pow(tan(.5 * elp.phi + FORTPI), EN->C) *
72
                srat(EN->e * sin(elp.phi), EN->ratexp) ) - HALFPI;
73
        slp.lam = EN->C * (elp.lam);
74
        return(slp);
75
}
76
        LP
77
pj_inv_gauss(LP slp, const void *en) {
78
        LP elp;
79
        double num;
80
        int i;
81

    
82
        elp.lam = slp.lam / EN->C;
83
        num = pow(tan(.5 * slp.phi + FORTPI)/EN->K, 1./EN->C);
84
        for (i = MAX_ITER; i; --i) {
85
                elp.phi = 2. * atan(num * srat(EN->e * sin(slp.phi), -.5 * EN->e))
86
                        - HALFPI;
87
                if (fabs(elp.phi - slp.phi) < DEL_TOL) break;
88
                        slp.phi = elp.phi;
89
        }        
90
        /* convergence failed */
91
        if (!i)
92
                pj_errno = -17;
93
        return (elp);
94
}
95
/* Revision Log:
96
** $Log: pj_gauss.c,v $
97
** Revision 1.1  2004/10/20 17:04:00  fwarmerdam
98
** New
99
**
100
** Revision 2.2  2004/03/15 16:07:42  gie
101
** removed es from init structure
102
**
103
** Revision 2.1  2003/03/28 01:44:30  gie
104
** Initial
105
**
106
*/
107