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