Blob


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