Coverage Report

Created: 2025-07-23 06:58

/src/PROJ/src/projections/putp4p.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
namespace { // anonymous namespace
10
struct pj_putp4p_data {
11
    double C_x, C_y;
12
};
13
} // anonymous namespace
14
15
PROJ_HEAD(putp4p, "Putnins P4'") "\n\tPCyl, Sph";
16
PROJ_HEAD(weren, "Werenskiold I") "\n\tPCyl, Sph";
17
18
2.85k
static PJ_XY putp4p_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */
19
2.85k
    PJ_XY xy = {0.0, 0.0};
20
2.85k
    struct pj_putp4p_data *Q = static_cast<struct pj_putp4p_data *>(P->opaque);
21
22
2.85k
    lp.phi = aasin(P->ctx, 0.883883476 * sin(lp.phi));
23
2.85k
    xy.x = Q->C_x * lp.lam * cos(lp.phi);
24
2.85k
    lp.phi *= 0.333333333333333;
25
2.85k
    xy.x /= cos(lp.phi);
26
2.85k
    xy.y = Q->C_y * sin(lp.phi);
27
28
2.85k
    return xy;
29
2.85k
}
30
31
0
static PJ_LP putp4p_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */
32
0
    PJ_LP lp = {0.0, 0.0};
33
0
    struct pj_putp4p_data *Q = static_cast<struct pj_putp4p_data *>(P->opaque);
34
35
0
    lp.phi = aasin(P->ctx, xy.y / Q->C_y);
36
0
    lp.lam = xy.x * cos(lp.phi) / Q->C_x;
37
0
    lp.phi *= 3.;
38
0
    lp.lam /= cos(lp.phi);
39
0
    lp.phi = aasin(P->ctx, 1.13137085 * sin(lp.phi));
40
41
0
    return lp;
42
0
}
43
44
13
PJ *PJ_PROJECTION(putp4p) {
45
13
    struct pj_putp4p_data *Q = static_cast<struct pj_putp4p_data *>(
46
13
        calloc(1, sizeof(struct pj_putp4p_data)));
47
13
    if (nullptr == Q)
48
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
49
13
    P->opaque = Q;
50
51
13
    Q->C_x = 0.874038744;
52
13
    Q->C_y = 3.883251825;
53
54
13
    P->es = 0.;
55
13
    P->inv = putp4p_s_inverse;
56
13
    P->fwd = putp4p_s_forward;
57
58
13
    return P;
59
13
}
60
61
47
PJ *PJ_PROJECTION(weren) {
62
47
    struct pj_putp4p_data *Q = static_cast<struct pj_putp4p_data *>(
63
47
        calloc(1, sizeof(struct pj_putp4p_data)));
64
47
    if (nullptr == Q)
65
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
66
47
    P->opaque = Q;
67
68
47
    Q->C_x = 1.;
69
47
    Q->C_y = 4.442882938;
70
71
47
    P->es = 0.;
72
47
    P->inv = putp4p_s_inverse;
73
47
    P->fwd = putp4p_s_forward;
74
75
47
    return P;
76
47
}