|
|
1.1 root 1: #include "map.h"
2:
3: static double cirmod(double);
4:
5: static struct place pole; /* map pole is tilted to here */
6: static struct coord twist; /* then twisted this much */
7: static struct place ipole; /* inverse transfrom */
8: static struct coord itwist;
9:
10: void
11: orient(double lat, double lon, double theta)
12: {
13: lat = cirmod(lat);
14: if(lat>90.) {
15: lat = 180. - lat;
16: lon -= 180.;
17: theta -= 180.;
18: } else if(lat < -90.) {
19: lat = -180. - lat;
20: lon -= 180.;
21: theta -= 180.;
22: }
23: latlon(lat,lon,&pole);
24: deg2rad(theta, &twist);
25: latlon(lat,180.-theta,&ipole);
26: deg2rad(180.-lon, &itwist);
27: }
28:
29: void
30: latlon(double lat, double lon, struct place *p)
31: {
32: lat = cirmod(lat);
33: if(lat>90.) {
34: lat = 180. - lat;
35: lon -= 180.;
36: } else if(lat < -90.) {
37: lat = -180. - lat;
38: lon -= 180.;
39: }
40: deg2rad(lat,&p->nlat);
41: deg2rad(lon,&p->wlon);
42: }
43:
44: void
45: deg2rad(double theta, struct coord *coord)
46: {
47: theta = cirmod(theta);
48: coord->l = theta*RAD;
49: if(theta==90) {
50: coord->s = 1;
51: coord->c = 0;
52: } else if(theta== -90) {
53: coord->s = -1;
54: coord->c = 0;
55: } else
56: sincos(coord);
57: }
58:
59: static double
60: cirmod(double theta)
61: {
62: while(theta >= 180.)
63: theta -= 360;
64: while(theta<-180.)
65: theta += 360.;
66: return(theta);
67: }
68:
69: void
70: sincos(struct coord *coord)
71: {
72: coord->s = sin(coord->l);
73: coord->c = cos(coord->l);
74: }
75:
76: void
77: normalize(struct place *gg)
78: {
79: norm(gg,&pole,&twist);
80: }
81:
82: void
83: invert(struct place *g)
84: {
85: norm(g,&ipole,&itwist);
86: }
87:
88: void
89: norm(struct place *gg, struct place *pp, struct coord *tw)
90: {
91: register struct place *g; /*geographic coords */
92: register struct place *p; /* new pole in old coords*/
93: struct place m; /* standard map coords*/
94: g = gg;
95: p = pp;
96: if(p->nlat.s == 1.) {
97: if(p->wlon.l+tw->l == 0.)
98: return;
99: g->wlon.l -= p->wlon.l+tw->l;
100: } else {
101: if(p->wlon.l != 0) {
102: g->wlon.l -= p->wlon.l;
103: sincos(&g->wlon);
104: }
105: m.nlat.s = p->nlat.s * g->nlat.s
106: + p->nlat.c * g->nlat.c * g->wlon.c;
107: m.nlat.c = sqrt(1. - m.nlat.s * m.nlat.s);
108: m.nlat.l = atan2(m.nlat.s, m.nlat.c);
109: m.wlon.s = g->nlat.c * g->wlon.s;
110: m.wlon.c = p->nlat.c * g->nlat.s
111: - p->nlat.s * g->nlat.c * g->wlon.c;
112: m.wlon.l = atan2(m.wlon.s, - m.wlon.c)
113: - tw->l;
114: *g = m;
115: }
116: sincos(&g->wlon);
117: if(g->wlon.l>PI)
118: g->wlon.l -= 2*PI;
119: else if(g->wlon.l<-PI)
120: g->wlon.l += 2*PI;
121: }
122:
123: void
124: printp(struct place *g)
125: {
126: printf("%.3f %.3f %.3f %.3f %.3f %.3f\n",
127: g->nlat.l,g->nlat.s,g->nlat.c,g->wlon.l,g->wlon.s,g->wlon.c);
128: }
129:
130: void
131: copyplace(struct place *g1, struct place *g2)
132: {
133: *g2 = *g1;
134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.