/src/PROJ/src/projections/urm5.cpp
Line | Count | Source |
1 | | |
2 | | |
3 | | #include <errno.h> |
4 | | #include <math.h> |
5 | | |
6 | | #include "proj.h" |
7 | | #include "proj_internal.h" |
8 | | |
9 | | PROJ_HEAD(urm5, "Urmaev V") "\n\tPCyl, Sph, no inv\n\tn= q= alpha="; |
10 | | |
11 | | namespace { // anonymous namespace |
12 | | struct pj_urm5 { |
13 | | double m, rmn, q3, n; |
14 | | }; |
15 | | } // anonymous namespace |
16 | | |
17 | 0 | static PJ_XY urm5_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */ |
18 | 0 | PJ_XY xy = {0.0, 0.0}; |
19 | 0 | struct pj_urm5 *Q = static_cast<struct pj_urm5 *>(P->opaque); |
20 | 0 | double t; |
21 | |
|
22 | 0 | t = lp.phi = aasin(P->ctx, Q->n * sin(lp.phi)); |
23 | 0 | xy.x = Q->m * lp.lam * cos(lp.phi); |
24 | 0 | t *= t; |
25 | 0 | xy.y = lp.phi * (1. + t * Q->q3) * Q->rmn; |
26 | 0 | return xy; |
27 | 0 | } |
28 | | |
29 | 5 | PJ *PJ_PROJECTION(urm5) { |
30 | 5 | double alpha, t; |
31 | 5 | struct pj_urm5 *Q = |
32 | 5 | static_cast<struct pj_urm5 *>(calloc(1, sizeof(struct pj_urm5))); |
33 | 5 | if (nullptr == Q) |
34 | 0 | return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/); |
35 | 5 | P->opaque = Q; |
36 | | |
37 | 5 | if (!pj_param(P->ctx, P->params, "tn").i) { |
38 | 3 | proj_log_error(P, _("Missing parameter n.")); |
39 | 3 | return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); |
40 | 3 | } |
41 | | |
42 | 2 | Q->n = pj_param(P->ctx, P->params, "dn").f; |
43 | 2 | if (Q->n <= 0. || Q->n > 1.) { |
44 | 1 | proj_log_error(P, |
45 | 1 | _("Invalid value for n: it should be in ]0,1] range.")); |
46 | 1 | return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); |
47 | 1 | } |
48 | | |
49 | 1 | Q->q3 = pj_param(P->ctx, P->params, "dq").f / 3.; |
50 | 1 | alpha = pj_param(P->ctx, P->params, "ralpha").f; |
51 | 1 | t = Q->n * sin(alpha); |
52 | 1 | const double denom = sqrt(1. - t * t); |
53 | 1 | if (denom == 0) { |
54 | 0 | proj_log_error( |
55 | 0 | P, |
56 | 0 | _("Invalid value for n / alpha: n * sin(|alpha|) should be < 1.")); |
57 | 0 | return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); |
58 | 0 | } |
59 | 1 | Q->m = cos(alpha) / denom; |
60 | 1 | Q->rmn = 1. / (Q->m * Q->n); |
61 | | |
62 | 1 | P->es = 0.; |
63 | 1 | P->inv = nullptr; |
64 | 1 | P->fwd = urm5_s_forward; |
65 | | |
66 | 1 | return P; |
67 | 1 | } |