/src/proj/src/projections/eck3.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | |
3 | | #include <errno.h> |
4 | | #include <math.h> |
5 | | |
6 | | #include "proj.h" |
7 | | #include "proj_internal.h" |
8 | | |
9 | | PROJ_HEAD(eck3, "Eckert III") "\n\tPCyl, Sph"; |
10 | | PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph"; |
11 | | PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph"; |
12 | | PROJ_HEAD(kav7, "Kavrayskiy VII") "\n\tPCyl, Sph"; |
13 | | |
14 | | namespace { // anonymous namespace |
15 | | struct pj_opaque { |
16 | | double C_x, C_y, A, B; |
17 | | }; |
18 | | } // anonymous namespace |
19 | | |
20 | 0 | static PJ_XY eck3_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
21 | 0 | PJ_XY xy = {0.0, 0.0}; |
22 | 0 | struct pj_opaque *Q = static_cast<struct pj_opaque *>(P->opaque); |
23 | |
|
24 | 0 | xy.y = Q->C_y * lp.phi; |
25 | 0 | xy.x = Q->C_x * lp.lam * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi)); |
26 | 0 | return xy; |
27 | 0 | } |
28 | | |
29 | 0 | static PJ_LP eck3_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */ |
30 | 0 | PJ_LP lp = {0.0, 0.0}; |
31 | 0 | struct pj_opaque *Q = static_cast<struct pj_opaque *>(P->opaque); |
32 | 0 | double denominator; |
33 | |
|
34 | 0 | lp.phi = xy.y / Q->C_y; |
35 | 0 | denominator = (Q->C_x * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi))); |
36 | 0 | if (denominator == 0.0) |
37 | 0 | lp.lam = HUGE_VAL; |
38 | 0 | else |
39 | 0 | lp.lam = xy.x / denominator; |
40 | 0 | return lp; |
41 | 0 | } |
42 | | |
43 | 677 | static PJ *setup(PJ *P) { |
44 | 677 | P->es = 0.; |
45 | 677 | P->inv = eck3_s_inverse; |
46 | 677 | P->fwd = eck3_s_forward; |
47 | 677 | return P; |
48 | 677 | } |
49 | | |
50 | 356 | PJ *PJ_PROJECTION(eck3) { |
51 | 356 | struct pj_opaque *Q = |
52 | 356 | static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque))); |
53 | 356 | if (nullptr == Q) |
54 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
55 | 356 | P->opaque = Q; |
56 | | |
57 | 356 | Q->C_x = 0.42223820031577120149; |
58 | 356 | Q->C_y = 0.84447640063154240298; |
59 | 356 | Q->A = 1.0; |
60 | 356 | Q->B = 0.4052847345693510857755; |
61 | | |
62 | 356 | return setup(P); |
63 | 356 | } |
64 | | |
65 | 101 | PJ *PJ_PROJECTION(kav7) { |
66 | 101 | struct pj_opaque *Q = |
67 | 101 | static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque))); |
68 | 101 | if (nullptr == Q) |
69 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
70 | 101 | P->opaque = Q; |
71 | | |
72 | | /* Defined twice in original code - Using 0.866..., |
73 | | * but leaving the other one here as a safety measure. |
74 | | * Q->C_x = 0.2632401569273184856851; */ |
75 | 101 | Q->C_x = 0.8660254037844; |
76 | 101 | Q->C_y = 1.; |
77 | 101 | Q->A = 0.; |
78 | 101 | Q->B = 0.30396355092701331433; |
79 | | |
80 | 101 | return setup(P); |
81 | 101 | } |
82 | | |
83 | 115 | PJ *PJ_PROJECTION(wag6) { |
84 | 115 | struct pj_opaque *Q = |
85 | 115 | static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque))); |
86 | 115 | if (nullptr == Q) |
87 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
88 | 115 | P->opaque = Q; |
89 | | |
90 | 115 | Q->C_x = 1.0; |
91 | 115 | Q->C_y = 1.0; |
92 | 115 | Q->A = 0.0; |
93 | 115 | Q->B = 0.30396355092701331433; |
94 | | |
95 | 115 | return setup(P); |
96 | 115 | } |
97 | | |
98 | 105 | PJ *PJ_PROJECTION(putp1) { |
99 | 105 | struct pj_opaque *Q = |
100 | 105 | static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque))); |
101 | 105 | if (nullptr == Q) |
102 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
103 | 105 | P->opaque = Q; |
104 | | |
105 | 105 | Q->C_x = 1.89490; |
106 | 105 | Q->C_y = 0.94745; |
107 | 105 | Q->A = -0.5; |
108 | 105 | Q->B = 0.30396355092701331433; |
109 | | |
110 | 105 | return setup(P); |
111 | 105 | } |