Coverage Report

Created: 2026-10-17 06:30

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