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"
6 28994509 2004-04-21 devnull static double cirmod(double);
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;
14 28994509 2004-04-21 devnull orient(double lat, double lon, double theta)
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;
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);
33 28994509 2004-04-21 devnull latlon(double lat, double lon, struct place *p)
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.;
43 28994509 2004-04-21 devnull deg2rad(lat,&p->nlat);
44 28994509 2004-04-21 devnull deg2rad(lon,&p->wlon);
48 28994509 2004-04-21 devnull deg2rad(double theta, struct coord *coord)
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;
59 28994509 2004-04-21 devnull sincos(coord);
62 28994509 2004-04-21 devnull static double
63 28994509 2004-04-21 devnull cirmod(double theta)
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);
73 28994509 2004-04-21 devnull sincos(struct coord *coord)
75 28994509 2004-04-21 devnull coord->s = sin(coord->l);
76 28994509 2004-04-21 devnull coord->c = cos(coord->l);
80 28994509 2004-04-21 devnull normalize(struct place *gg)
82 28994509 2004-04-21 devnull norm(gg,&pole,&twist);
86 28994509 2004-04-21 devnull invert(struct place *g)
88 28994509 2004-04-21 devnull norm(g,&ipole,&itwist);
92 28994509 2004-04-21 devnull norm(struct place *gg, struct place *pp, struct coord *tw)
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*/
99 28994509 2004-04-21 devnull if(p->nlat.s == 1.) {
100 28994509 2004-04-21 devnull if(p->wlon.l+tw->l == 0.)
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);
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;
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;
127 28994509 2004-04-21 devnull printp(struct place *g)
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);
134 28994509 2004-04-21 devnull copyplace(struct place *g1, struct place *g2)
136 28994509 2004-04-21 devnull *g2 = *g1;