/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 |