1 #define PJ_LIB__
2 #include    <projects.h>
3 
4 PROJ_HEAD(denoy, "Denoyer Semi-Elliptical") "\n\tPCyl., no inv., Sph.";
5 
6 #define C0  0.95
7 #define C1 -0.08333333333333333333
8 #define C3  0.00166666666666666666
9 #define D1  0.9
10 #define D5  0.03
11 
12 
s_forward(LP lp,PJ * P)13 static XY s_forward (LP lp, PJ *P) {            /* Spheroidal, forward */
14     XY xy = {0.0, 0.0};
15     (void) P;
16     xy.y = lp.phi;
17     xy.x = lp.lam;
18     lp.lam = fabs(lp.lam);
19     xy.x *= cos((C0 + lp.lam * (C1 + lp.lam * lp.lam * C3)) *
20             (lp.phi * (D1 + D5 * lp.phi * lp.phi * lp.phi * lp.phi)));
21     return xy;
22 }
23 
24 
freeup_new(PJ * P)25 static void *freeup_new (PJ *P) {               /* Destructor */
26     return pj_dealloc(P);
27 }
28 
freeup(PJ * P)29 static void freeup (PJ *P) {
30     freeup_new (P);
31     return;
32 }
33 
34 
PROJECTION(denoy)35 PJ *PROJECTION(denoy) {
36     P->es = 0.0;
37     P->fwd = s_forward;
38 
39     return P;
40 }
41 
42 #ifndef PJ_SELFTEST
pj_denoy_selftest(void)43 int pj_denoy_selftest (void) {return 0;}
44 #else
45 
pj_denoy_selftest(void)46 int pj_denoy_selftest (void) {
47     double tolerance_xy = 1e-7;
48 
49     char s_args[] = {"+proj=denoy   +a=6400000    +lat_1=0.5 +lat_2=2"};
50 
51     LP fwd_in[] = {
52         { 2, 1},
53         { 2,-1},
54         {-2, 1},
55         {-2,-1}
56     };
57 
58     XY s_fwd_expect[] = {
59         { 223377.422876954137,  111701.07212763709},
60         { 223377.422876954137, -111701.07212763709},
61         {-223377.422876954137,  111701.07212763709},
62         {-223377.422876954137, -111701.07212763709},
63     };
64 
65     return pj_generic_selftest (0, s_args, tolerance_xy, 0, 4, 4, fwd_in, 0, s_fwd_expect, 0, 0, 0);
66 }
67 
68 
69 #endif
70