1 #define PJ_LIB__
2 #include <projects.h>
3 
4 PROJ_HEAD(eck3, "Eckert III") "\n\tPCyl, Sph.";
5 PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph.";
6 PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph.";
7 PROJ_HEAD(kav7, "Kavraisky VII") "\n\tPCyl, Sph.";
8 
9 struct pj_opaque {
10     double C_x, C_y, A, B;
11 };
12 
13 
s_forward(LP lp,PJ * P)14 static XY s_forward (LP lp, PJ *P) {           /* Spheroidal, forward */
15     XY xy = {0.0,0.0};
16     struct pj_opaque *Q = P->opaque;
17 
18     xy.y = Q->C_y * lp.phi;
19     xy.x = Q->C_x * lp.lam * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi));
20     return xy;
21 }
22 
23 
s_inverse(XY xy,PJ * P)24 static LP s_inverse (XY xy, PJ *P) {           /* Spheroidal, inverse */
25     LP lp = {0.0,0.0};
26     struct pj_opaque *Q = P->opaque;
27 
28     lp.phi = xy.y / Q->C_y;
29     lp.lam = xy.x / (Q->C_x * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi)));
30     return lp;
31 }
32 
33 
freeup_new(PJ * P)34 static void *freeup_new (PJ *P) {               /* Destructor */
35     if (0==P)
36         return 0;
37     if (0==P->opaque)
38         return pj_dealloc (P);
39     pj_dealloc (P->opaque);
40     return pj_dealloc(P);
41 }
42 
43 
freeup(PJ * P)44 static void freeup (PJ *P) {
45     freeup_new (P);
46     return;
47 }
48 
49 
setup(PJ * P)50 static PJ *setup(PJ *P) {
51     P->es = 0.;
52     P->inv = s_inverse;
53     P->fwd = s_forward;
54     return P;
55 }
56 
57 
PROJECTION(eck3)58 PJ *PROJECTION(eck3) {
59     struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
60     if (0==Q)
61         return freeup_new (P);
62     P->opaque = Q;
63 
64     Q->C_x = 0.42223820031577120149;
65     Q->C_y = 0.84447640063154240298;
66     Q->A = 1.0;
67     Q->B = 0.4052847345693510857755;
68 
69     return setup(P);
70 }
71 
72 
PROJECTION(kav7)73 PJ *PROJECTION(kav7) {
74     struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
75     if (0==Q)
76         return freeup_new (P);
77     P->opaque = Q;
78 
79     /* Defined twice in original code - Using 0.866...,
80      * but leaving the other one here as a safety measure.
81      * Q->C_x = 0.2632401569273184856851; */
82     Q->C_x = 0.8660254037844;
83     Q->C_y = 1.;
84     Q->A = 0.;
85     Q->B = 0.30396355092701331433;
86 
87     return setup(P);
88 }
89 
90 
PROJECTION(wag6)91 PJ *PROJECTION(wag6) {
92     struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
93     if (0==Q)
94         return freeup_new (P);
95     P->opaque = Q;
96 
97     Q->C_x = Q->C_y = 0.94745;
98     Q->A = 0.0;
99     Q->B = 0.30396355092701331433;
100 
101     return setup(P);
102 }
103 
104 
PROJECTION(putp1)105 PJ *PROJECTION(putp1) {
106     struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
107     if (0==Q)
108         return freeup_new (P);
109     P->opaque = Q;
110 
111     Q->C_x = 1.89490;
112     Q->C_y = 0.94745;
113     Q->A = -0.5;
114     Q->B = 0.30396355092701331433;
115 
116     return setup(P);
117 }
118 
119 
120 #ifndef PJ_SELFTEST
pj_eck3_selftest(void)121 int pj_eck3_selftest (void) {return 0;}
122 #else
123 
pj_eck3_selftest(void)124 int pj_eck3_selftest (void) {
125     double tolerance_lp = 1e-10;
126     double tolerance_xy = 1e-7;
127 
128     char s_args[] = {"+proj=eck3   +a=6400000    +lat_1=0.5 +lat_2=2"};
129 
130     LP fwd_in[] = {
131         { 2, 1},
132         { 2,-1},
133         {-2, 1},
134         {-2,-1}
135     };
136 
137     XY s_fwd_expect[] = {
138         { 188652.01572153764,  94328.919337031271},
139         { 188652.01572153764, -94328.919337031271},
140         {-188652.01572153764,  94328.919337031271},
141         {-188652.01572153764, -94328.919337031271},
142     };
143 
144     XY inv_in[] = {
145         { 200, 100},
146         { 200,-100},
147         {-200, 100},
148         {-200,-100}
149     };
150 
151     LP s_inv_expect[] = {
152         { 0.0021202405520236059,  0.0010601202759750307},
153         { 0.0021202405520236059, -0.0010601202759750307},
154         {-0.0021202405520236059,  0.0010601202759750307},
155         {-0.0021202405520236059, -0.0010601202759750307},
156     };
157 
158     return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
159 }
160 
161 
162 #endif
163 
164 #ifndef PJ_SELFTEST
pj_kav7_selftest(void)165 int pj_kav7_selftest (void) {return 0;}
166 #else
167 
pj_kav7_selftest(void)168 int pj_kav7_selftest (void) {
169     double tolerance_lp = 1e-10;
170     double tolerance_xy = 1e-7;
171 
172     char s_args[] = {"+proj=kav7   +a=6400000    +lat_1=0.5 +lat_2=2"};
173 
174     LP fwd_in[] = {
175         { 2, 1},
176         { 2,-1},
177         {-2, 1},
178         {-2,-1}
179     };
180 
181     XY s_fwd_expect[] = {
182         { 193462.9749437288,  111701.07212763709},
183         { 193462.9749437288, -111701.07212763709},
184         {-193462.9749437288,  111701.07212763709},
185         {-193462.9749437288, -111701.07212763709}
186     };
187 
188     XY inv_in[] = {
189         { 200, 100},
190         { 200,-100},
191         {-200, 100},
192         {-200,-100}
193     };
194 
195     LP s_inv_expect[] = {
196         { 0.0020674833579085268,  0.00089524655489191132},
197         { 0.0020674833579085268, -0.00089524655489191132},
198         {-0.0020674833579085268,  0.00089524655489191132},
199         {-0.0020674833579085268, -0.00089524655489191132}
200     };
201 
202     return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
203 }
204 
205 
206 #endif
207 
208 #ifndef PJ_SELFTEST
pj_wag6_selftest(void)209 int pj_wag6_selftest (void) {return 0;}
210 #else
211 
pj_wag6_selftest(void)212 int pj_wag6_selftest (void) {
213     double tolerance_lp = 1e-10;
214     double tolerance_xy = 1e-7;
215 
216     char s_args[] = {"+proj=wag6   +a=6400000    +lat_1=0.5 +lat_2=2"};
217 
218     LP fwd_in[] = {
219         { 2, 1},
220         { 2,-1},
221         {-2, 1},
222         {-2,-1}
223     };
224 
225     XY s_fwd_expect[] = {
226         { 211652.56216440981,  105831.18078732977},
227         { 211652.56216440981, -105831.18078732977},
228         {-211652.56216440981,  105831.18078732977},
229         {-211652.56216440981, -105831.18078732977}
230     };
231 
232     XY inv_in[] = {
233         { 200, 100},
234         { 200,-100},
235         {-200, 100},
236         {-200,-100}
237     };
238 
239     LP s_inv_expect[] = {
240         { 0.0018898022163257513,  0.000944901108123818},
241         { 0.0018898022163257513, -0.000944901108123818},
242         {-0.0018898022163257513,  0.000944901108123818},
243         {-0.0018898022163257513, -0.000944901108123818}
244     };
245 
246     return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
247 }
248 
249 
250 #endif
251 
252 
253 #ifndef PJ_SELFTEST
pj_putp1_selftest(void)254 int pj_putp1_selftest (void) {return 0;}
255 #else
256 
pj_putp1_selftest(void)257 int pj_putp1_selftest (void) {
258     double tolerance_lp = 1e-10;
259     double tolerance_xy = 1e-7;
260 
261     char s_args[] = {"+proj=putp1   +a=6400000    +lat_1=0.5 +lat_2=2"};
262 
263     LP fwd_in[] = {
264         { 2, 1},
265         { 2,-1},
266         {-2, 1},
267         {-2,-1}
268     };
269 
270     XY s_fwd_expect[] = {
271         { 211642.76275416015,  105831.18078732977},
272         { 211642.76275416015, -105831.18078732977},
273         {-211642.76275416015,  105831.18078732977},
274         {-211642.76275416015, -105831.18078732977}
275     };
276 
277     XY inv_in[] = {
278         { 200, 100},
279         { 200,-100},
280         {-200, 100},
281         {-200,-100}
282     };
283 
284     LP s_inv_expect[] = {
285         { 0.0018898022164038663,  0.000944901108123818},
286         { 0.0018898022164038663, -0.000944901108123818},
287         {-0.0018898022164038663,  0.000944901108123818},
288         {-0.0018898022164038663, -0.000944901108123818}
289     };
290 
291     return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
292 }
293 
294 
295 #endif
296