Coverage Report

Created: 2025-08-03 06:36

/src/PROJ/src/projections/rpoly.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
namespace { // anonymous namespace
10
struct pj_rpoly_data {
11
    double phi1;
12
    double fxa;
13
    double fxb;
14
    int mode;
15
};
16
} // anonymous namespace
17
18
PROJ_HEAD(rpoly, "Rectangular Polyconic")
19
"\n\tConic, Sph, no inv\n\tlat_ts=";
20
21
3
#define EPS 1e-9
22
23
0
static PJ_XY rpoly_s_forward(PJ_LP lp, PJ *P) { /* Spheroidal, forward */
24
0
    PJ_XY xy = {0.0, 0.0};
25
0
    struct pj_rpoly_data *Q = static_cast<struct pj_rpoly_data *>(P->opaque);
26
0
    double fa;
27
28
0
    if (Q->mode)
29
0
        fa = tan(lp.lam * Q->fxb) * Q->fxa;
30
0
    else
31
0
        fa = 0.5 * lp.lam;
32
0
    if (fabs(lp.phi) < EPS) {
33
0
        xy.x = fa + fa;
34
0
        xy.y = -P->phi0;
35
0
    } else {
36
0
        xy.y = 1. / tan(lp.phi);
37
0
        fa = 2. * atan(fa * sin(lp.phi));
38
0
        xy.x = sin(fa) * xy.y;
39
0
        xy.y = lp.phi - P->phi0 + (1. - cos(fa)) * xy.y;
40
0
    }
41
0
    return xy;
42
0
}
43
44
3
PJ *PJ_PROJECTION(rpoly) {
45
3
    struct pj_rpoly_data *Q = static_cast<struct pj_rpoly_data *>(
46
3
        calloc(1, sizeof(struct pj_rpoly_data)));
47
3
    if (nullptr == Q)
48
0
        return pj_default_destructor(P, PROJ_ERR_OTHER /*ENOMEM*/);
49
3
    P->opaque = Q;
50
51
3
    Q->phi1 = fabs(pj_param(P->ctx, P->params, "rlat_ts").f);
52
3
    Q->mode = Q->phi1 > EPS;
53
3
    if (Q->mode) {
54
0
        Q->fxb = 0.5 * sin(Q->phi1);
55
0
        Q->fxa = 0.5 / Q->fxb;
56
0
    }
57
3
    P->es = 0.;
58
3
    P->fwd = rpoly_s_forward;
59
60
3
    return P;
61
3
}
62
63
#undef EPS