URI:
       tzcoord.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tzcoord.c (2505B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <stdio.h>
            4 #include "map.h"
            5 
            6 static double cirmod(double);
            7 
            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;
           12 
           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 }
           31 
           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 }
           46 
           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 }
           61 
           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 }
           71 
           72 void
           73 sincos(struct coord *coord)
           74 {
           75         coord->s = sin(coord->l);
           76         coord->c = cos(coord->l);
           77 }
           78 
           79 void
           80 normalize(struct place *gg)
           81 {
           82         norm(gg,&pole,&twist);
           83 }
           84 
           85 void
           86 invert(struct place *g)
           87 {
           88         norm(g,&ipole,&itwist);
           89 }
           90 
           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);
          107                 }
          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;
          118         }
          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;
          124 }
          125 
          126 void
          127 printp(struct place *g)
          128 {
          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);
          131 }
          132 
          133 void
          134 copyplace(struct place *g1, struct place *g2)
          135 {
          136         *g2 = *g1;
          137 }