Coverage Report

Created: 2026-05-30 06:46

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
37.8k
#define TOL 1e-10
19
20
22.6k
static PJ_XY vandg2_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */
21
22.6k
    PJ_XY xy = {0.0, 0.0};
22
22.6k
    struct pj_vandg2 *Q = static_cast<struct pj_vandg2 *>(P->opaque);
23
22.6k
    double x1, at, bt, ct;
24
25
22.6k
    bt = fabs(M_TWO_D_PI * lp.phi);
26
22.6k
    ct = 1. - bt * bt;
27
22.6k
    if (ct < 0.)
28
0
        ct = 0.;
29
22.6k
    else
30
22.6k
        ct = sqrt(ct);
31
22.6k
    if (fabs(lp.lam) < TOL) {
32
0
        xy.x = 0.;
33
0
        xy.y = M_PI * (lp.phi < 0. ? -bt : bt) / (1. + ct);
34
22.6k
    } else {
35
22.6k
        at = 0.5 * fabs(M_PI / lp.lam - lp.lam / M_PI);
36
22.6k
        if (Q->vdg3) {
37
7.56k
            x1 = bt / (1. + ct);
38
7.56k
            xy.x = M_PI * (sqrt(at * at + 1. - x1 * x1) - at);
39
7.56k
            xy.y = M_PI * x1;
40
15.1k
        } else {
41
15.1k
            x1 = (ct * sqrt(1. + at * at) - at * ct * ct) /
42
15.1k
                 (1. + at * at * bt * bt);
43
15.1k
            xy.x = M_PI * x1;
44
15.1k
            xy.y = M_PI * sqrt(1. - x1 * (x1 + 2. * at) + TOL);
45
15.1k
        }
46
22.6k
        if (lp.lam < 0.)
47
21.9k
            xy.x = -xy.x;
48
22.6k
        if (lp.phi < 0.)
49
0
            xy.y = -xy.y;
50
22.6k
    }
51
52
22.6k
    return xy;
53
22.6k
}
54
55
246
PJ *PJ_PROJECTION(vandg2) {
56
246
    struct pj_vandg2 *Q =
57
246
        static_cast<struct pj_vandg2 *>(calloc(1, sizeof(struct pj_vandg2)));
58
246
    if (nullptr == Q)
59
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
60
246
    P->opaque = Q;
61
62
246
    Q->vdg3 = 0;
63
246
    P->fwd = vandg2_s_forward;
64
65
246
    return P;
66
246
}
67
68
117
PJ *PJ_PROJECTION(vandg3) {
69
117
    struct pj_vandg2 *Q =
70
117
        static_cast<struct pj_vandg2 *>(calloc(1, sizeof(struct pj_vandg2)));
71
117
    if (nullptr == Q)
72
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
73
117
    P->opaque = Q;
74
75
117
    Q->vdg3 = 1;
76
117
    P->es = 0.;
77
117
    P->fwd = vandg2_s_forward;
78
79
117
    return P;
80
117
}
81
82
#undef TOL