/src/PROJ/src/projections/putp3.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | #include <errno.h> |
3 | | |
4 | | #include "proj.h" |
5 | | #include "proj_internal.h" |
6 | | |
7 | | namespace { // anonymous namespace |
8 | | struct pj_putp3_data { |
9 | | double A; |
10 | | }; |
11 | | } // anonymous namespace |
12 | | |
13 | | PROJ_HEAD(putp3, "Putnins P3") "\n\tPCyl, Sph"; |
14 | | PROJ_HEAD(putp3p, "Putnins P3'") "\n\tPCyl, Sph"; |
15 | | |
16 | 672 | #define C 0.79788456 |
17 | 29 | #define RPISQ 0.1013211836 |
18 | | |
19 | 336 | static PJ_XY putp3_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
20 | 336 | PJ_XY xy = {0.0, 0.0}; |
21 | | |
22 | 336 | xy.x = C * lp.lam * |
23 | 336 | (1. - static_cast<struct pj_putp3_data *>(P->opaque)->A * lp.phi * |
24 | 336 | lp.phi); |
25 | 336 | xy.y = C * lp.phi; |
26 | | |
27 | 336 | return xy; |
28 | 336 | } |
29 | | |
30 | 0 | static PJ_LP putp3_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */ |
31 | 0 | PJ_LP lp = {0.0, 0.0}; |
32 | |
|
33 | 0 | lp.phi = xy.y / C; |
34 | 0 | lp.lam = |
35 | 0 | xy.x / (C * (1. - static_cast<struct pj_putp3_data *>(P->opaque)->A * |
36 | 0 | lp.phi * lp.phi)); |
37 | |
|
38 | 0 | return lp; |
39 | 0 | } |
40 | | |
41 | 21 | PJ *PJ_PROJECTION(putp3) { |
42 | 21 | struct pj_putp3_data *Q = static_cast<struct pj_putp3_data *>( |
43 | 21 | calloc(1, sizeof(struct pj_putp3_data))); |
44 | 21 | if (nullptr == Q) |
45 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
46 | 21 | P->opaque = Q; |
47 | | |
48 | 21 | Q->A = 4. * RPISQ; |
49 | | |
50 | 21 | P->es = 0.; |
51 | 21 | P->inv = putp3_s_inverse; |
52 | 21 | P->fwd = putp3_s_forward; |
53 | | |
54 | 21 | return P; |
55 | 21 | } |
56 | | |
57 | 8 | PJ *PJ_PROJECTION(putp3p) { |
58 | 8 | struct pj_putp3_data *Q = static_cast<struct pj_putp3_data *>( |
59 | 8 | calloc(1, sizeof(struct pj_putp3_data))); |
60 | 8 | if (nullptr == Q) |
61 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
62 | 8 | P->opaque = Q; |
63 | | |
64 | 8 | Q->A = 2. * RPISQ; |
65 | | |
66 | 8 | P->es = 0.; |
67 | 8 | P->inv = putp3_s_inverse; |
68 | 8 | P->fwd = putp3_s_forward; |
69 | | |
70 | 8 | return P; |
71 | 8 | } |
72 | | |
73 | | #undef C |
74 | | #undef RPISQ |