Blame


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"
4 28994509 2004-04-21 devnull
5 28994509 2004-04-21 devnull #define ORTHRAD 1000
6 28994509 2004-04-21 devnull static double viewpt;
7 28994509 2004-04-21 devnull
8 28994509 2004-04-21 devnull static int
9 28994509 2004-04-21 devnull Xperspective(struct place *place, double *x, double *y)
10 28994509 2004-04-21 devnull {
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;
17 28994509 2004-04-21 devnull if(r>4.)
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);
23 28994509 2004-04-21 devnull }
24 28994509 2004-04-21 devnull
25 28994509 2004-04-21 devnull proj
26 28994509 2004-04-21 devnull perspective(double radius)
27 28994509 2004-04-21 devnull {
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);
34 28994509 2004-04-21 devnull }
35 28994509 2004-04-21 devnull
36 28994509 2004-04-21 devnull /* called from various conformal projections,
37 28994509 2004-04-21 devnull but not from stereographic itself */
38 28994509 2004-04-21 devnull int
39 28994509 2004-04-21 devnull Xstereographic(struct place *place, double *x, double *y)
40 28994509 2004-04-21 devnull {
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;
47 28994509 2004-04-21 devnull }
48 28994509 2004-04-21 devnull
49 28994509 2004-04-21 devnull proj
50 28994509 2004-04-21 devnull stereographic(void)
51 28994509 2004-04-21 devnull {
52 28994509 2004-04-21 devnull viewpt = -1.;
53 28994509 2004-04-21 devnull return(Xperspective);
54 28994509 2004-04-21 devnull }
55 28994509 2004-04-21 devnull
56 28994509 2004-04-21 devnull proj
57 28994509 2004-04-21 devnull gnomonic(void)
58 28994509 2004-04-21 devnull {
59 28994509 2004-04-21 devnull viewpt = 0.;
60 28994509 2004-04-21 devnull return(Xperspective);
61 28994509 2004-04-21 devnull }
62 28994509 2004-04-21 devnull
63 28994509 2004-04-21 devnull int
64 28994509 2004-04-21 devnull plimb(double *lat, double *lon, double res)
65 28994509 2004-04-21 devnull {
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;
76 28994509 2004-04-21 devnull else
77 28994509 2004-04-21 devnull *lat = asin(1/viewpt)/RAD;
78 28994509 2004-04-21 devnull } else
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;
84 28994509 2004-04-21 devnull }