Coverage Report

Created: 2026-01-17 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PROJ/src/projections/vandg2.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
namespace { // anonymous namespace
10
struct pj_vandg2 {
11
    int vdg3;
12
};
13
} // anonymous namespace
14
15
PROJ_HEAD(vandg2, "van der Grinten II") "\n\tMisc Sph, no inv";
16
PROJ_HEAD(vandg3, "van der Grinten III") "\n\tMisc Sph, no inv";
17
18
17.8k
#define TOL 1e-10
19
20
10.2k
static PJ_XY vandg2_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */
21
10.2k
    PJ_XY xy = {0.0, 0.0};
22
10.2k
    struct pj_vandg2 *Q = static_cast<struct pj_vandg2 *>(P->opaque);
23
10.2k
    double x1, at, bt, ct;
24
25
10.2k
    bt = fabs(M_TWO_D_PI * lp.phi);
26
10.2k
    ct = 1. - bt * bt;
27
10.2k
    if (ct < 0.)
28
0
        ct = 0.;
29
10.2k
    else
30
10.2k
        ct = sqrt(ct);
31
10.2k
    if (fabs(lp.lam) < TOL) {
32
0
        xy.x = 0.;
33
0
        xy.y = M_PI * (lp.phi < 0. ? -bt : bt) / (1. + ct);
34
10.2k
    } else {
35
10.2k
        at = 0.5 * fabs(M_PI / lp.lam - lp.lam / M_PI);
36
10.2k
        if (Q->vdg3) {
37
2.68k
            x1 = bt / (1. + ct);
38
2.68k
            xy.x = M_PI * (sqrt(at * at + 1. - x1 * x1) - at);
39
2.68k
            xy.y = M_PI * x1;
40
7.56k
        } else {
41
7.56k
            x1 = (ct * sqrt(1. + at * at) - at * ct * ct) /
42
7.56k
                 (1. + at * at * bt * bt);
43
7.56k
            xy.x = M_PI * x1;
44
7.56k
            xy.y = M_PI * sqrt(1. - x1 * (x1 + 2. * at) + TOL);
45
7.56k
        }
46
10.2k
        if (lp.lam < 0.)
47
9.74k
            xy.x = -xy.x;
48
10.2k
        if (lp.phi < 0.)
49
0
            xy.y = -xy.y;
50
10.2k
    }
51
52
10.2k
    return xy;
53
10.2k
}
54
55
137
PJ *PJ_PROJECTION(vandg2) {
56
137
    struct pj_vandg2 *Q =
57
137
        static_cast<struct pj_vandg2 *>(calloc(1, sizeof(struct pj_vandg2)));
58
137
    if (nullptr == Q)
59
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
60
137
    P->opaque = Q;
61
62
137
    Q->vdg3 = 0;
63
137
    P->fwd = vandg2_s_forward;
64
65
137
    return P;
66
137
}
67
68
45
PJ *PJ_PROJECTION(vandg3) {
69
45
    struct pj_vandg2 *Q =
70
45
        static_cast<struct pj_vandg2 *>(calloc(1, sizeof(struct pj_vandg2)));
71
45
    if (nullptr == Q)
72
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
73
45
    P->opaque = Q;
74
75
45
    Q->vdg3 = 1;
76
45
    P->es = 0.;
77
45
    P->fwd = vandg2_s_forward;
78
79
45
    return P;
80
45
}
81
82
#undef TOL