1 28994509 2004-04-21 devnull #include <u.h>
2 28994509 2004-04-21 devnull #include <libc.h>
3 28994509 2004-04-21 devnull #include "map.h"
5 28994509 2004-04-21 devnull #define ORTHRAD 1000
6 28994509 2004-04-21 devnull static double viewpt;
8 28994509 2004-04-21 devnull static int
9 28994509 2004-04-21 devnull Xperspective(struct place *place, double *x, double *y)
11 28994509 2004-04-21 devnull double r;
12 310ae033 2017-01-06 rsc if(viewpt<=1+FUZZ && fabs(place->nlat.s)<=viewpt+.01)
13 28994509 2004-04-21 devnull return(-1);
14 28994509 2004-04-21 devnull r = place->nlat.c*(viewpt - 1.)/(viewpt - place->nlat.s);
15 28994509 2004-04-21 devnull *x = - r*place->wlon.s;
16 28994509 2004-04-21 devnull *y = - r*place->wlon.c;
18 28994509 2004-04-21 devnull return(-1);
19 28994509 2004-04-21 devnull if(fabs(viewpt)>1 && place->nlat.s<1/viewpt ||
20 28994509 2004-04-21 devnull fabs(viewpt)<=1 && place->nlat.s<viewpt)
21 28994509 2004-04-21 devnull return 0;
22 28994509 2004-04-21 devnull return(1);
26 28994509 2004-04-21 devnull perspective(double radius)
28 28994509 2004-04-21 devnull viewpt = radius;
29 28994509 2004-04-21 devnull if(viewpt >= ORTHRAD)
30 28994509 2004-04-21 devnull return(Xorthographic);
31 28994509 2004-04-21 devnull if(fabs(viewpt-1.)<.0001)
32 28994509 2004-04-21 devnull return(0);
33 28994509 2004-04-21 devnull return(Xperspective);
36 28994509 2004-04-21 devnull /* called from various conformal projections,
37 28994509 2004-04-21 devnull but not from stereographic itself */
39 28994509 2004-04-21 devnull Xstereographic(struct place *place, double *x, double *y)
41 28994509 2004-04-21 devnull double v = viewpt;
42 28994509 2004-04-21 devnull int retval;
43 28994509 2004-04-21 devnull viewpt = -1;
44 28994509 2004-04-21 devnull retval = Xperspective(place, x, y);
45 28994509 2004-04-21 devnull viewpt = v;
46 28994509 2004-04-21 devnull return retval;
50 28994509 2004-04-21 devnull stereographic(void)
52 28994509 2004-04-21 devnull viewpt = -1.;
53 28994509 2004-04-21 devnull return(Xperspective);
57 28994509 2004-04-21 devnull gnomonic(void)
59 28994509 2004-04-21 devnull viewpt = 0.;
60 28994509 2004-04-21 devnull return(Xperspective);
64 28994509 2004-04-21 devnull plimb(double *lat, double *lon, double res)
66 28994509 2004-04-21 devnull static int first = 1;
67 28994509 2004-04-21 devnull if(viewpt >= ORTHRAD)
68 28994509 2004-04-21 devnull return olimb(lat, lon, res);
69 28994509 2004-04-21 devnull if(first) {
70 28994509 2004-04-21 devnull first = 0;
71 28994509 2004-04-21 devnull *lon = -180;
72 28994509 2004-04-21 devnull if(fabs(viewpt) < .01)
73 28994509 2004-04-21 devnull *lat = 0;
74 28994509 2004-04-21 devnull else if(fabs(viewpt)<=1)
75 28994509 2004-04-21 devnull *lat = asin(viewpt)/RAD;
77 28994509 2004-04-21 devnull *lat = asin(1/viewpt)/RAD;
79 28994509 2004-04-21 devnull *lon += res;
80 28994509 2004-04-21 devnull if(*lon <= 180)
81 28994509 2004-04-21 devnull return 1;
82 28994509 2004-04-21 devnull first = 1;
83 28994509 2004-04-21 devnull return -1;