/src/proj/src/projections/urmfps.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(urmfps, "Urmaev Flat-Polar Sinusoidal") "\n\tPCyl, Sph\n\tn="; |
10 | | PROJ_HEAD(wag1, "Wagner I (Kavrayskiy VI)") "\n\tPCyl, Sph"; |
11 | | |
12 | | namespace { // anonymous namespace |
13 | | struct pj_urmfps { |
14 | | double n, C_y; |
15 | | }; |
16 | | } // anonymous namespace |
17 | | |
18 | 0 | #define C_x 0.8773826753 |
19 | 2.36k | #define Cy 1.139753528477 |
20 | | |
21 | 0 | static PJ_XY urmfps_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
22 | 0 | PJ_XY xy = {0.0, 0.0}; |
23 | 0 | lp.phi = aasin(P->ctx, |
24 | 0 | static_cast<struct pj_urmfps *>(P->opaque)->n * sin(lp.phi)); |
25 | 0 | xy.x = C_x * lp.lam * cos(lp.phi); |
26 | 0 | xy.y = static_cast<struct pj_urmfps *>(P->opaque)->C_y * lp.phi; |
27 | 0 | return xy; |
28 | 0 | } |
29 | | |
30 | 0 | static PJ_LP urmfps_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */ |
31 | 0 | PJ_LP lp = {0.0, 0.0}; |
32 | 0 | xy.y /= static_cast<struct pj_urmfps *>(P->opaque)->C_y; |
33 | 0 | lp.phi = aasin(P->ctx, |
34 | 0 | sin(xy.y) / static_cast<struct pj_urmfps *>(P->opaque)->n); |
35 | 0 | lp.lam = xy.x / (C_x * cos(xy.y)); |
36 | 0 | return lp; |
37 | 0 | } |
38 | | |
39 | 2.36k | static PJ *urmfps_setup(PJ *P) { |
40 | 2.36k | static_cast<struct pj_urmfps *>(P->opaque)->C_y = |
41 | 2.36k | Cy / static_cast<struct pj_urmfps *>(P->opaque)->n; |
42 | 2.36k | P->es = 0.; |
43 | 2.36k | P->inv = urmfps_s_inverse; |
44 | 2.36k | P->fwd = urmfps_s_forward; |
45 | 2.36k | return P; |
46 | 2.36k | } |
47 | | |
48 | 13 | PJ *PJ_PROJECTION(urmfps) { |
49 | 13 | struct pj_urmfps *Q = |
50 | 13 | static_cast<struct pj_urmfps *>(calloc(1, sizeof(struct pj_urmfps))); |
51 | 13 | if (nullptr == Q) |
52 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
53 | | |
54 | 13 | P->opaque = Q; |
55 | | |
56 | 13 | if (!pj_param(P->ctx, P->params, "tn").i) { |
57 | 9 | proj_log_error(P, _("Missing parameter n.")); |
58 | 9 | return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); |
59 | 9 | } |
60 | | |
61 | 4 | Q->n = pj_param(P->ctx, P->params, "dn").f; |
62 | 4 | if (Q->n <= 0. || Q->n > 1.) { |
63 | 4 | proj_log_error(P, |
64 | 4 | _("Invalid value for n: it should be in ]0,1] range.")); |
65 | 4 | return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); |
66 | 4 | } |
67 | | |
68 | 0 | return urmfps_setup(P); |
69 | 4 | } |
70 | | |
71 | 2.36k | PJ *PJ_PROJECTION(wag1) { |
72 | 2.36k | struct pj_urmfps *Q = |
73 | 2.36k | static_cast<struct pj_urmfps *>(calloc(1, sizeof(struct pj_urmfps))); |
74 | 2.36k | if (nullptr == Q) |
75 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
76 | 2.36k | P->opaque = Q; |
77 | | |
78 | 2.36k | static_cast<struct pj_urmfps *>(P->opaque)->n = |
79 | 2.36k | 0.8660254037844386467637231707; |
80 | 2.36k | return urmfps_setup(P); |
81 | 2.36k | } |
82 | | |
83 | | #undef C_x |
84 | | #undef Cy |