1 # define HLFPI2 2.46740110027233965467 /* (pi/2)^2 */
2 # define EPS 1e-10
3 #define PJ_LIB__
4 #include <errno.h>
5 #include <math.h>
6
7 #include "proj.h"
8 #include "proj_internal.h"
9
10
11 namespace { // anonymous namespace
12 struct pj_opaque {
13 int bacn;
14 int ortl;
15 };
16 } // anonymous namespace
17
18 PROJ_HEAD(apian, "Apian Globular I") "\n\tMisc Sph, no inv";
19 PROJ_HEAD(ortel, "Ortelius Oval") "\n\tMisc Sph, no inv";
20 PROJ_HEAD(bacon, "Bacon Globular") "\n\tMisc Sph, no inv";
21
22
bacon_s_forward(PJ_LP lp,PJ * P)23 static PJ_XY bacon_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward */
24 PJ_XY xy = {0.0,0.0};
25 struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
26 double ax, f;
27
28 xy.y = Q->bacn ? M_HALFPI * sin(lp.phi) : lp.phi;
29 ax = fabs(lp.lam);
30 if (ax >= EPS) {
31 if (Q->ortl && ax >= M_HALFPI)
32 xy.x = sqrt(HLFPI2 - lp.phi * lp.phi + EPS) + ax - M_HALFPI;
33 else {
34 f = 0.5 * (HLFPI2 / ax + ax);
35 xy.x = ax - f + sqrt(f * f - xy.y * xy.y);
36 }
37 if (lp.lam < 0.) xy.x = - xy.x;
38 } else
39 xy.x = 0.;
40 return (xy);
41 }
42
43
44
PROJECTION(bacon)45 PJ *PROJECTION(bacon) {
46 struct pj_opaque *Q = static_cast<struct pj_opaque*>(pj_calloc (1, sizeof (struct pj_opaque)));
47 if (nullptr==Q)
48 return pj_default_destructor (P, ENOMEM);
49 P->opaque = Q;
50
51 Q->bacn = 1;
52 Q->ortl = 0;
53 P->es = 0.;
54 P->fwd = bacon_s_forward;
55 return P;
56 }
57
58
PROJECTION(apian)59 PJ *PROJECTION(apian) {
60 struct pj_opaque *Q = static_cast<struct pj_opaque*>(pj_calloc (1, sizeof (struct pj_opaque)));
61 if (nullptr==Q)
62 return pj_default_destructor (P, ENOMEM);
63 P->opaque = Q;
64
65 Q->bacn = Q->ortl = 0;
66 P->es = 0.;
67 P->fwd = bacon_s_forward;
68 return P;
69 }
70
71
PROJECTION(ortel)72 PJ *PROJECTION(ortel) {
73 struct pj_opaque *Q = static_cast<struct pj_opaque*>(pj_calloc (1, sizeof (struct pj_opaque)));
74 if (nullptr==Q)
75 return pj_default_destructor (P, ENOMEM);
76 P->opaque = Q;
77
78 Q->bacn = 0;
79 Q->ortl = 1;
80 P->es = 0.;
81 P->fwd = bacon_s_forward;
82 return P;
83 }
84