Coverage Report

Created: 2026-03-22 06:35

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