Coverage Report

Created: 2026-01-17 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}