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