Annotation of researchv10no/cmd/map/libmap/zcoord.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.