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