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

1.1       root        1: #include "map.h"
                      2: 
                      3: static struct coord p0;                /* standard parallel */
                      4: 
                      5: int first;
                      6: 
                      7: static double
                      8: trigclamp(double x)
                      9: {
                     10:        return x>1? 1: x<-1? -1: x;
                     11: }
                     12: 
                     13: static struct coord az;                /* azimuth of p0 seen from place */
                     14: static struct coord rad;       /* angular dist from place to p0 */
                     15: 
                     16: static int
                     17: azimuth(struct place *place)
                     18: {
                     19:        if(place->nlat.c < FUZZ) {
                     20:                az.l = PI/2 + place->nlat.l - place->wlon.l;
                     21:                sincos(&az);
                     22:                rad.l = fabs(place->nlat.l - p0.l);
                     23:                if(rad.l > PI)
                     24:                        rad.l = 2*PI - rad.l;
                     25:                sincos(&rad);
                     26:                return 1;
                     27:        }
                     28:        rad.c = trigclamp(p0.s*place->nlat.s +  /* law of cosines */
                     29:                p0.c*place->nlat.c*place->wlon.c);
                     30:        rad.s = sqrt(1 - rad.c*rad.c);
                     31:        if(fabs(rad.s) < .001) {
                     32:                az.s = 0;
                     33:                az.c = 1;
                     34:        } else {
                     35:                az.s = trigclamp(p0.c*place->wlon.s/rad.s); /* sines */
                     36:                az.c = trigclamp((p0.s - rad.c*place->nlat.s)
                     37:                                /(rad.s*place->nlat.c));
                     38:        }
                     39:        rad.l = atan2(rad.s, rad.c);
                     40:        return 1;
                     41: }
                     42: 
                     43: static int
                     44: Xmecca(struct place *place, double *x, double *y)
                     45: {
                     46:        if(!azimuth(place))
                     47:                return 0;
                     48:        *x = -place->wlon.l;
                     49:        *y = fabs(az.s)<.02? -az.c*rad.s/p0.c: *x*az.c/az.s;
                     50:        return fabs(*y)>2? -1:
                     51:               rad.c<0? 0:
                     52:               1;
                     53: }
                     54: 
                     55: proj
                     56: mecca(double par)
                     57: {
                     58:        first = 1;
                     59:        if(fabs(par)>80.)
                     60:                return(0);
                     61:        deg2rad(par,&p0);
                     62:        return(Xmecca);
                     63: }
                     64: 
                     65: static int
                     66: Xhoming(struct place *place, double *x, double *y)
                     67: {
                     68:        if(!azimuth(place))
                     69:                return 0;
                     70:        *x = -rad.l*az.s;
                     71:        *y = -rad.l*az.c;
                     72:        return place->wlon.c<0? 0: 1;
                     73: }
                     74: 
                     75: proj
                     76: homing(double par)
                     77: {
                     78:        first = 1;
                     79:        if(fabs(par)>80.)
                     80:                return(0);
                     81:        deg2rad(par,&p0);
                     82:        return(Xhoming);
                     83: }
                     84: 
                     85: int
                     86: hlimb(double *lat, double *lon, double res)
                     87: {
                     88:        if(first) {
                     89:                *lon = -90;
                     90:                *lat = -90;
                     91:                first = 0;
                     92:                return 0;
                     93:        }
                     94:        *lat += res;
                     95:        if(*lat <= 90) 
                     96:                return 1;
                     97:        if(*lon == 90)
                     98:                return -1;
                     99:        *lon = 90;
                    100:        *lat = -90;
                    101:        return 0;
                    102: }
                    103: 
                    104: int
                    105: mlimb(double *lat, double *lon, double res)
                    106: {
                    107:        int ret = !first;
                    108:        if(fabs(p0.s) < .01)
                    109:                return -1;
                    110:        if(first) {
                    111:                *lon = -180;
                    112:                first = 0;
                    113:        } else
                    114:                *lon += res;
                    115:        if(*lon > 180)
                    116:                return -1;
                    117:        *lat = atan(-cos(*lon*RAD)/p0.s*p0.c)/RAD;
                    118:        return ret;
                    119: }

unix.superglobalmegacorp.com

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