Coverage Report

Created: 2025-07-18 07:18

/src/PROJ/src/projections/eck3.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(eck3, "Eckert III") "\n\tPCyl, Sph";
10
PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph";
11
PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph";
12
PROJ_HEAD(kav7, "Kavrayskiy VII") "\n\tPCyl, Sph";
13
14
namespace { // anonymous namespace
15
struct pj_opaque {
16
    double C_x, C_y, A, B;
17
};
18
} // anonymous namespace
19
20
85.6k
static PJ_XY eck3_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */
21
85.6k
    PJ_XY xy = {0.0, 0.0};
22
85.6k
    struct pj_opaque *Q = static_cast<struct pj_opaque *>(P->opaque);
23
24
85.6k
    xy.y = Q->C_y * lp.phi;
25
85.6k
    xy.x = Q->C_x * lp.lam * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi));
26
85.6k
    return xy;
27
85.6k
}
28
29
0
static PJ_LP eck3_s_inverse(PJ_XY xy, PJ *P) { /* Spheroidal, inverse */
30
0
    PJ_LP lp = {0.0, 0.0};
31
0
    struct pj_opaque *Q = static_cast<struct pj_opaque *>(P->opaque);
32
0
    double denominator;
33
34
0
    lp.phi = xy.y / Q->C_y;
35
0
    denominator = (Q->C_x * (Q->A + asqrt(1. - Q->B * lp.phi * lp.phi)));
36
0
    if (denominator == 0.0)
37
0
        lp.lam = HUGE_VAL;
38
0
    else
39
0
        lp.lam = xy.x / denominator;
40
0
    return lp;
41
0
}
42
43
1.12k
static PJ *setup(PJ *P) {
44
1.12k
    P->es = 0.;
45
1.12k
    P->inv = eck3_s_inverse;
46
1.12k
    P->fwd = eck3_s_forward;
47
1.12k
    return P;
48
1.12k
}
49
50
302
PJ *PJ_PROJECTION(eck3) {
51
302
    struct pj_opaque *Q =
52
302
        static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque)));
53
302
    if (nullptr == Q)
54
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
55
302
    P->opaque = Q;
56
57
302
    Q->C_x = 0.42223820031577120149;
58
302
    Q->C_y = 0.84447640063154240298;
59
302
    Q->A = 1.0;
60
302
    Q->B = 0.4052847345693510857755;
61
62
302
    return setup(P);
63
302
}
64
65
97
PJ *PJ_PROJECTION(kav7) {
66
97
    struct pj_opaque *Q =
67
97
        static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque)));
68
97
    if (nullptr == Q)
69
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
70
97
    P->opaque = Q;
71
72
    /* Defined twice in original code - Using 0.866...,
73
     * but leaving the other one here as a safety measure.
74
     * Q->C_x = 0.2632401569273184856851; */
75
97
    Q->C_x = 0.8660254037844;
76
97
    Q->C_y = 1.;
77
97
    Q->A = 0.;
78
97
    Q->B = 0.30396355092701331433;
79
80
97
    return setup(P);
81
97
}
82
83
707
PJ *PJ_PROJECTION(wag6) {
84
707
    struct pj_opaque *Q =
85
707
        static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque)));
86
707
    if (nullptr == Q)
87
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
88
707
    P->opaque = Q;
89
90
707
    Q->C_x = 1.0;
91
707
    Q->C_y = 1.0;
92
707
    Q->A = 0.0;
93
707
    Q->B = 0.30396355092701331433;
94
95
707
    return setup(P);
96
707
}
97
98
17
PJ *PJ_PROJECTION(putp1) {
99
17
    struct pj_opaque *Q =
100
17
        static_cast<struct pj_opaque *>(calloc(1, sizeof(struct pj_opaque)));
101
17
    if (nullptr == Q)
102
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
103
17
    P->opaque = Q;
104
105
17
    Q->C_x = 1.89490;
106
17
    Q->C_y = 0.94745;
107
17
    Q->A = -0.5;
108
17
    Q->B = 0.30396355092701331433;
109
110
17
    return setup(P);
111
17
}