/src/PROJ/src/projections/vandg4.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | |
3 | | #include <math.h> |
4 | | |
5 | | #include "proj.h" |
6 | | #include "proj_internal.h" |
7 | | |
8 | | PROJ_HEAD(vandg4, "van der Grinten IV") "\n\tMisc Sph, no inv"; |
9 | | |
10 | 20.1k | #define TOL 1e-10 |
11 | | |
12 | 5.04k | static PJ_XY vandg4_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
13 | 5.04k | PJ_XY xy = {0.0, 0.0}; |
14 | 5.04k | double x1, t, bt, ct, ft, bt2, ct2, dt, dt2; |
15 | 5.04k | (void)P; |
16 | | |
17 | 5.04k | if (fabs(lp.phi) < TOL) { |
18 | 0 | xy.x = lp.lam; |
19 | 0 | xy.y = 0.; |
20 | 5.04k | } else if (fabs(lp.lam) < TOL || fabs(fabs(lp.phi) - M_HALFPI) < TOL) { |
21 | 0 | xy.x = 0.; |
22 | 0 | xy.y = lp.phi; |
23 | 5.04k | } else { |
24 | 5.04k | bt = fabs(M_TWO_D_PI * lp.phi); |
25 | 5.04k | bt2 = bt * bt; |
26 | 5.04k | ct = 0.5 * (bt * (8. - bt * (2. + bt2)) - 5.) / (bt2 * (bt - 1.)); |
27 | 5.04k | ct2 = ct * ct; |
28 | 5.04k | dt = M_TWO_D_PI * lp.lam; |
29 | 5.04k | dt = dt + 1. / dt; |
30 | 5.04k | dt = sqrt(dt * dt - 4.); |
31 | 5.04k | if ((fabs(lp.lam) - M_HALFPI) < 0.) |
32 | 2.75k | dt = -dt; |
33 | 5.04k | dt2 = dt * dt; |
34 | 5.04k | x1 = bt + ct; |
35 | 5.04k | x1 *= x1; |
36 | 5.04k | t = bt + 3. * ct; |
37 | 5.04k | ft = x1 * (bt2 + ct2 * dt2 - 1.) + |
38 | 5.04k | (1. - bt2) * |
39 | 5.04k | (bt2 * (t * t + 4. * ct2) + ct2 * (12. * bt * ct + 4. * ct2)); |
40 | 5.04k | x1 = (dt * (x1 + ct2 - 1.) + 2. * sqrt(ft)) / (4. * x1 + dt2); |
41 | 5.04k | xy.x = M_HALFPI * x1; |
42 | 5.04k | xy.y = M_HALFPI * sqrt(1. + dt * fabs(x1) - x1 * x1); |
43 | 5.04k | if (lp.lam < 0.) |
44 | 4.87k | xy.x = -xy.x; |
45 | 5.04k | if (lp.phi < 0.) |
46 | 0 | xy.y = -xy.y; |
47 | 5.04k | } |
48 | 5.04k | return xy; |
49 | 5.04k | } |
50 | | |
51 | 84 | PJ *PJ_PROJECTION(vandg4) { |
52 | 84 | P->es = 0.; |
53 | 84 | P->fwd = vandg4_s_forward; |
54 | | |
55 | 84 | return P; |
56 | 84 | } |