Blob


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