/src/PROJ/src/projections/mbtfpp.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(mbtfpp, "McBride-Thomas Flat-Polar Parabolic") "\n\tCyl, Sph"; |
9 | | |
10 | 0 | #define CSy .95257934441568037152 |
11 | 0 | #define FXC .92582009977255146156 |
12 | 0 | #define FYC 3.40168025708304504493 |
13 | 0 | #define C23 .66666666666666666666 |
14 | 0 | #define C13 .33333333333333333333 |
15 | 0 | #define ONEEPS 1.0000001 |
16 | | |
17 | 0 | static PJ_XY mbtfpp_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
18 | 0 | PJ_XY xy = {0.0, 0.0}; |
19 | 0 | (void)P; |
20 | |
|
21 | 0 | lp.phi = asin(CSy * sin(lp.phi)); |
22 | 0 | xy.x = FXC * lp.lam * (2. * cos(C23 * lp.phi) - 1.); |
23 | 0 | xy.y = FYC * sin(C13 * lp.phi); |
24 | 0 | return xy; |
25 | 0 | } |
26 | | |
27 | 0 | static PJ_LP mbtfpp_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */ |
28 | 0 | PJ_LP lp = {0.0, 0.0}; |
29 | |
|
30 | 0 | lp.phi = xy.y / FYC; |
31 | 0 | if (fabs(lp.phi) >= 1.) { |
32 | 0 | if (fabs(lp.phi) > ONEEPS) { |
33 | 0 | proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
34 | 0 | return lp; |
35 | 0 | } else { |
36 | 0 | lp.phi = (lp.phi < 0.) ? -M_HALFPI : M_HALFPI; |
37 | 0 | } |
38 | 0 | } else |
39 | 0 | lp.phi = asin(lp.phi); |
40 | | |
41 | 0 | lp.phi *= 3.; |
42 | 0 | lp.lam = xy.x / (FXC * (2. * cos(C23 * lp.phi) - 1.)); |
43 | 0 | lp.phi = sin(lp.phi) / CSy; |
44 | 0 | if (fabs(lp.phi) >= 1.) { |
45 | 0 | if (fabs(lp.phi) > ONEEPS) { |
46 | 0 | proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
47 | 0 | return lp; |
48 | 0 | } else { |
49 | 0 | lp.phi = (lp.phi < 0.) ? -M_HALFPI : M_HALFPI; |
50 | 0 | } |
51 | 0 | } else |
52 | 0 | lp.phi = asin(lp.phi); |
53 | | |
54 | 0 | return lp; |
55 | 0 | } |
56 | | |
57 | 11 | PJ *PJ_PROJECTION(mbtfpp) { |
58 | | |
59 | 11 | P->es = 0.; |
60 | 11 | P->inv = mbtfpp_s_inverse; |
61 | 11 | P->fwd = mbtfpp_s_forward; |
62 | | |
63 | 11 | return P; |
64 | 11 | } |
65 | | |
66 | | #undef CSy |
67 | | #undef FXC |
68 | | #undef FYC |
69 | | #undef C23 |
70 | | #undef C13 |
71 | | #undef ONEEPS |