/* kleinmcl.c reads klein '.dat' files and makes the '.mcl' file to run 'makecol.c' */ #include #include "getfile.c" #include #define DP100M 0.0009009 #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define DEG_M 111120 /* converts degrees to meters -- 60 nmiles */ #define FILE_HEADER 5120 #define HEADER 32 #define DATA 404 #define TRAILER 4 #define NUMPTS 25 int NumAvg=5,NumHdg=3; /* + or - points */ union intflo { long lnum; float fnum; }; struct r_header { float lat,lon,time; int mo,da,yr,hr,min,sec; int pass_num,line_num,course,prp,corr_alt,uncorr_alt,rec_size; }; unsigned char Buffer[1024],DBuff[1024]; main() { int i,j,k; int numfiles; numfiles=load_names("kln*.dat"); printf("There are %d files.\n",numfiles); for(i=31;i0.0) dist=sqrt(dist); distsum+=dist; distnum+=1.0; if(dist>distmax) distmax=dist; if(dist0.0) dist=sqrt(dist); px=-dy/dist; py= dx/dist; heading=atan2(dx,dy); if(heading<0.0) heading+=360.0*DEG_RAD; printf("%3d %10.7lf %11.7lf %4.2lf %4.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", file,dlat/dnum,dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); } } /*********************************************************************** ** ** ** ** ************************************************************************/ int start_up(dat,nlat,nlon,dlat,dlon,fp,k,numavg,file) struct r_header *dat; double *nlat,*nlon; double *dlat,*dlon; FILE *fp; int k,numavg,file; { int i,j; unsigned char dbuff[32]; double dnum=0.0,dellat=0.0,dellon=0.0; double dx,dy,heading,dist,px,py; *dlat=*dlon=0.0; fread((char *)dbuff,sizeof(char),HEADER,fp); fread((char *)DBuff,sizeof(char),DATA+TRAILER,fp); j=k; decode_hdr(dbuff,&dat[j%NUMPTS]); *dlat+=dat[j%NUMPTS].lat; *dlon+=dat[j%NUMPTS].lon; dnum+=1.0; nlat[j%NUMPTS]=*dlat; nlon[j%NUMPTS]=*dlon; printf("%3d %10.6f %11.6f\n",file,dat[j%NUMPTS].lat,dat[j%NUMPTS].lon); for(i=1;i<=numavg;i++) { j=i*2-1+k; fread((char *)dbuff,sizeof(char),HEADER,fp); fread((char *)DBuff,sizeof(char),DATA+TRAILER,fp); decode_hdr(dbuff,&dat[(j)%NUMPTS]); *dlat+=dat[(j)%NUMPTS].lat; *dlon+=dat[(j)%NUMPTS].lon; dnum+=1.0; j=i*2+k; fread((char *)dbuff,sizeof(char),HEADER,fp); fread((char *)DBuff,sizeof(char),DATA+TRAILER,fp); decode_hdr(dbuff,&dat[(j)%NUMPTS]); *dlat+=dat[(j)%NUMPTS].lat; *dlon+=dat[(j)%NUMPTS].lon; dnum+=1.0; nlat[i%NUMPTS]=*dlat/dnum; nlon[i%NUMPTS]=*dlon/dnum; dy=(nlat[i%NUMPTS]-nlat[(i-1)%NUMPTS])*DEG_M; dx=(nlon[i%NUMPTS]-nlon[(i-1)%NUMPTS])* cos(nlat[i%NUMPTS]*DEG_RAD)*DEG_M; dist=dx*dx+dy*dy; if(dist>0.0) dist=sqrt(dist); px=-dy/dist; py= dx/dist; heading=atan2(dx,dy); if(heading<0.0) heading+=360*DEG_RAD; printf("%3d %10.7lf %11.7lf %4.2lf %4.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", file,*dlat/dnum,*dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); } } /*********************************************************************** ** ** ** ** ************************************************************************/ int decode_hdr(dbuff,dat) unsigned char *dbuff; struct r_header *dat; { int mo,da,yr,hr,min,sec; union intflo dval; float lat,lon,time; dval.lnum=dbuff[23]; dval.lnum*=256; dval.lnum+=dbuff[22]; dval.lnum*=256; dval.lnum+=dbuff[21]; dval.lnum*=256; dval.lnum+=dbuff[20]; dec2nec(&dval.lnum,1); lat=dval.fnum; dval.lnum=dbuff[27]; dval.lnum*=256; dval.lnum+=dbuff[26]; dval.lnum*=256; dval.lnum+=dbuff[25]; dval.lnum*=256; dval.lnum+=dbuff[24]; dec2nec(&dval.lnum,1); lon=dval.fnum; dval.lnum=dbuff[19]; dval.lnum*=256; dval.lnum+=dbuff[18]; dval.lnum*=256; dval.lnum+=dbuff[17]; dval.lnum*=256; dval.lnum+=dbuff[16]; dec2nec(&dval.lnum,1); time=dval.fnum; min=time; sec=time*60; sec%=60; mo=dbuff[9]*256+dbuff[8]; da=dbuff[11]*256+dbuff[10]; yr=dbuff[13]*256+dbuff[12]; hr=dbuff[15]*256+dbuff[14]; dat->pass_num=dbuff[1]*256+dbuff[0]; dat->line_num=dbuff[3]*256+dbuff[2]; dat->course=dbuff[5]*256+dbuff[4]; dat->prp=dbuff[7]*256+dbuff[6]; dat->lat=lat; dat->lon=lon; dat->time=time; dat->yr=yr; dat->mo=mo; dat->da=da; dat->hr=hr; dat->min=min; dat->sec=sec; } /************************************************************************** ** ** ** ************************************************************************* */ int dec2nec(a,n) long *a; int n; { long *w2; short i,j,z[2],y; w2=(long *)z; for(i=0;i