/src/PROJ/src/projections/nicol.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(nicol, "Nicolosi Globular") "\n\tMisc Sph, no inv"; |
9 | | |
10 | 0 | #define EPS 1e-10 |
11 | | |
12 | 0 | static PJ_XY nicol_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
13 | 0 | PJ_XY xy = {0.0, 0.0}; |
14 | 0 | (void)P; |
15 | |
|
16 | 0 | if (fabs(lp.lam) < EPS) { |
17 | 0 | xy.x = 0; |
18 | 0 | xy.y = lp.phi; |
19 | 0 | } else if (fabs(lp.phi) < EPS) { |
20 | 0 | xy.x = lp.lam; |
21 | 0 | xy.y = 0.; |
22 | 0 | } else if (fabs(fabs(lp.lam) - M_HALFPI) < EPS) { |
23 | 0 | xy.x = lp.lam * cos(lp.phi); |
24 | 0 | xy.y = M_HALFPI * sin(lp.phi); |
25 | 0 | } else if (fabs(fabs(lp.phi) - M_HALFPI) < EPS) { |
26 | 0 | xy.x = 0; |
27 | 0 | xy.y = lp.phi; |
28 | 0 | } else { |
29 | 0 | double tb, c, d, m, n, r2, sp; |
30 | |
|
31 | 0 | tb = M_HALFPI / lp.lam - lp.lam / M_HALFPI; |
32 | 0 | c = lp.phi / M_HALFPI; |
33 | 0 | d = (1 - c * c) / ((sp = sin(lp.phi)) - c); |
34 | 0 | r2 = tb / d; |
35 | 0 | r2 *= r2; |
36 | 0 | m = (tb * sp / d - 0.5 * tb) / (1. + r2); |
37 | 0 | n = (sp / r2 + 0.5 * d) / (1. + 1. / r2); |
38 | 0 | xy.x = cos(lp.phi); |
39 | 0 | xy.x = sqrt(m * m + xy.x * xy.x / (1. + r2)); |
40 | 0 | xy.x = M_HALFPI * (m + (lp.lam < 0. ? -xy.x : xy.x)); |
41 | 0 | xy.y = sqrt(n * n - (sp * sp / r2 + d * sp - 1.) / (1. + 1. / r2)); |
42 | 0 | xy.y = M_HALFPI * (n + (lp.phi < 0. ? xy.y : -xy.y)); |
43 | 0 | } |
44 | 0 | return (xy); |
45 | 0 | } |
46 | | |
47 | 5 | PJ *PJ_PROJECTION(nicol) { |
48 | 5 | P->es = 0.; |
49 | 5 | P->fwd = nicol_s_forward; |
50 | | |
51 | 5 | return P; |
52 | 5 | } |