Annotation of researchv10no/cmd/map/export/route.c, revision 1.1.1.1

1.1       root        1: #include "map.h"
                      2: 
                      3: /* Given two lat-lon pairs, find an orientation for the
                      4:    -o option of "map" that will place those two points
                      5:    on the equator of a standard projection, equally spaced
                      6:    about the prime meridian.   Both an erect and an inverted
                      7:    orientation are found.
                      8: 
                      9:    Option -t prints out a series of
                     10:    coordinates that follows the (great circle) track
                     11:    in the original coordinate system,
                     12:    followed by ".
                     13:    This data is just right for map -t.
                     14: */
                     15: struct place pole;
                     16: struct coord twist;
                     17: int track;
                     18: 
                     19: extern void doroute(double, double, double, double, double);
                     20: 
                     21: void
                     22: dorot(double a, double b, double *x, double *y, void (*f)(struct place *))
                     23: {
                     24:        struct place g;
                     25:        deg2rad(a,&g.nlat);
                     26:        deg2rad(b,&g.wlon);
                     27:        (*f)(&g);
                     28:        *x = g.nlat.l/RAD;
                     29:        *y = g.wlon.l/RAD;
                     30: }
                     31: 
                     32: void
                     33: rotate(double a, double b, double *x, double *y)
                     34: {
                     35:        dorot(a,b,x,y,normalize);
                     36: }
                     37: 
                     38: void
                     39: rinvert(double a, double b, double *x, double *y)
                     40: {
                     41:        dorot(a,b,x,y,invert);
                     42: }
                     43: 
                     44: main(int argc, char **argv)
                     45: {
                     46: #pragma ref argv
                     47:        double an,aw,bn,bw;
                     48:        track = argc>1;
                     49:        for(;;){
                     50:                if(scanf("%lf%lf%lf%lf",&an,&aw,&bn,&bw)!=4)
                     51:                        break;
                     52:                doroute(-90.,an,aw,bn,bw);
                     53:                if(!track)
                     54:                        doroute(90.,an,aw,bn,bw);
                     55:        }
                     56:        return 0;
                     57: }
                     58: 
                     59: void
                     60: doroute(double dir, double an, double aw, double bn, double bw)
                     61: {
                     62:        double an1,aw1,bn1,bw1,pn,pw;
                     63:        double theta;
                     64:        double cn,cw,cn1,cw1;
                     65:        int i,n;
                     66:        orient(an,aw,0.);
                     67:        rotate(bn,bw,&bn1,&bw1);
                     68: /*     printf("b %f %f\n",bn1,bw1);*/
                     69:        orient(an,aw,bw1);
                     70:        rinvert(0.,dir,&pn,&pw);
                     71: /*     printf("p %f %f\n",pn,pw);*/
                     72:        orient(pn,pw,0.);
                     73:        rotate(an,aw,&an1,&aw1);
                     74:        rotate(bn,bw,&bn1,&bw1);
                     75:        theta = (aw1+bw1)/2;
                     76: /*     printf("a %f %f \n",an1,aw1);*/
                     77:        orient(pn,pw,theta);
                     78:        rotate(an,aw,&an1,&aw1);
                     79:        rotate(bn,bw,&bn1,&bw1);
                     80:        if(fabs(aw1-bw1)>180)
                     81:                if(theta<0.) theta+=180;
                     82:                else theta -= 180;
                     83:        orient(pn,pw,theta);
                     84:        rotate(an,aw,&an1,&aw1);
                     85:        rotate(bn,bw,&bn1,&bw1);
                     86:        if(!track) {
                     87:                printf("-o %.4f %.4f %.4f\n",pn,pw,theta);
                     88:                printf("A %.4f %.4f\n",an1,aw1);
                     89:                printf("B %.4f %.4f\n",bn1,bw1);
                     90:        } else {
                     91:                cn1 = 0;
                     92:                n = 1 + fabs(bw1-aw1)/.2;
                     93:                for(i=0;i<=n;i++) {
                     94:                        cw1 = aw1 + i*(bw1-aw1)/n;
                     95:                        rinvert(cn1,cw1,&cn,&cw);
                     96:                        printf("%f %f\n",cn,cw);
                     97:                }
                     98:                printf("\"\n");
                     99:        }
                    100: }

unix.superglobalmegacorp.com

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