/src/gdal/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 | 0 | #define C 0.79788456 |
17 | 0 | #define RPISQ 0.1013211836 |
18 | | |
19 | 0 | static PJ_XY putp3_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
20 | 0 | PJ_XY xy = {0.0, 0.0}; |
21 | |
|
22 | 0 | xy.x = C * lp.lam * |
23 | 0 | (1. - static_cast<struct pj_putp3_data *>(P->opaque)->A * lp.phi * |
24 | 0 | lp.phi); |
25 | 0 | xy.y = C * lp.phi; |
26 | |
|
27 | 0 | return xy; |
28 | 0 | } |
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 | 0 | PJ *PJ_PROJECTION(putp3) { |
42 | 0 | struct pj_putp3_data *Q = static_cast<struct pj_putp3_data *>( |
43 | 0 | calloc(1, sizeof(struct pj_putp3_data))); |
44 | 0 | if (nullptr == Q) |
45 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
46 | 0 | P->opaque = Q; |
47 | |
|
48 | 0 | Q->A = 4. * RPISQ; |
49 | |
|
50 | 0 | P->es = 0.; |
51 | 0 | P->inv = putp3_s_inverse; |
52 | 0 | P->fwd = putp3_s_forward; |
53 | |
|
54 | 0 | return P; |
55 | 0 | } |
56 | | |
57 | 0 | PJ *PJ_PROJECTION(putp3p) { |
58 | 0 | struct pj_putp3_data *Q = static_cast<struct pj_putp3_data *>( |
59 | 0 | calloc(1, sizeof(struct pj_putp3_data))); |
60 | 0 | if (nullptr == Q) |
61 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
62 | 0 | P->opaque = Q; |
63 | |
|
64 | 0 | Q->A = 2. * RPISQ; |
65 | |
|
66 | 0 | P->es = 0.; |
67 | 0 | P->inv = putp3_s_inverse; |
68 | 0 | P->fwd = putp3_s_forward; |
69 | |
|
70 | 0 | return P; |
71 | 0 | } |
72 | | |
73 | | #undef C |
74 | | #undef RPISQ |