/* elev.c */ #include #include #include #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define E_RAD 6400 #define E_CIR 40212 #define ROW 2060 #define COL 4320 int Elev[COL],E16[COL]; unsigned char E8[COL]; char CBuff[6481]; int scan_height(double lat1,double lat2,double lon1,double lon2, long *max,long *min); int wf_flat(double lat1,double lat2,double lon1,double lon2, double clat,double r,long dmin,long dmax,char *name,double km_in, double bottom_thick); main() { int i,j,k; int row,col; char ans,string[100],cr=0xd; double lat1,lat2,lon1,lon2,clat,r,km_in,dlon,dlat; double lt1,ln1,lt2,ln2,thick=0.5; long max,min; do { printf(" 1 -- read North ASCII file and make 16-bit '.img'\n"); printf(" 2 -- read South ASCII file and make 16-bit '.img'\n"); printf(" 3 -- combine N and S images\n"); printf(" 4 -- make a sub image in Wave front format (round)\n"); printf(" 5 -- make a sub image in Wave front format (flat/solid)\n"); printf(" 6 -- make a sub image in Wave front format (flat/skin)\n"); printf(" 7 -- make a sub image set in Wave front format (flat/solid)\n"); printf("\n a -- check max min of set\n"); printf("\n x -- exit program\n\n"); ans=getch(); if(ans=='1') read_ascii("elev_n"); if(ans=='2') read_ascii("elev_s"); if(ans=='3') comb("elev_n","elev_s","globe"); if(ans=='4') { printf("give minimum and maximum latitude\n"); scanf("%lf%lf",&lat1,&lat2); printf("give minimum and maximum longitude\n"); scanf("%lf%lf",&lon1,&lon2); printf("Give earth radius in kilometers (640 gives 10 x relief)\n"); scanf("%lf",&r); wf(lat1,lat2,lon1,lon2,r); } if(ans=='5') { printf("give minimum and maximum latitude\n"); scanf("%lf%lf",&lat1,&lat2); printf("give minimum and maximum longitude\n"); scanf("%lf%lf",&lon1,&lon2); printf("Give elevation scale exageration\n"); scanf("%lf",&r); printf("give central latitide\n"); scanf("%lf",&clat); if(scan_height(lat1,lat2,lon1,lon2,&max,&min)>=0) { printf("min = %ld max = %ld\n",min,max); km_in=9.0/((lat2-lat1)*111.7); wf_flat(lat1,lat2,lon1,lon2,clat,r,min,max,"globe.wvf",km_in, (double)0.125); } } if(ans=='6') { printf("give minimum and maximum latitude\n"); scanf("%lf%lf",&lat1,&lat2); printf("give minimum and maximum longitude\n"); scanf("%lf%lf",&lon1,&lon2); printf("Give elevation scale exageration\n"); scanf("%lf",&r); printf("give central latitide\n"); scanf("%lf",&clat); printf("give thickness in inches.\n"); scanf("%lf",&thick); if(scan_height(lat1,lat2,lon1,lon2,&max,&min)>=0) { printf("min = %ld max = %ld\n",min,max); km_in=9.0/((lat2-lat1)*111.7); wf_flat_skin(lat1,lat2,lon1,lon2,clat,r,min,max,"globe.wvf",km_in, thick); } } if(ans=='7') { printf("give minimum and maximum latitude\n"); scanf("%lf%lf",&lat1,&lat2); printf("give minimum and maximum longitude\n"); scanf("%lf%lf",&lon1,&lon2); printf("Give elevation scale exageration\n"); scanf("%lf",&r); clat=(lat2+lat1)/2.0; printf("Give latitude and longitude of sub boxes.\n\n"); scanf("%lf%lf",&dlat,&dlon); row=(lat2-lat1)/dlat+0.5; col=(lon2-lon1)/dlon+0.5; printf("Working %d rows and %d columns of boxes.\n\n",row,col); if(scan_height(lat1,lat2,lon1,lon2,&max,&min)>=0) { printf("min = %ld max = %ld\n",min,max); km_in=9.0/(dlat*111.7); for(i=0;i=0) printf("min = %ld max = %ld\n",min,max); } }while(ans!='x'); } /********************************************************************** ** ** thickness is in inches ** **********************************************************************/ int wf_flat_skin(double lat1,double lat2,double lon1,double lon2, double clat,double r,long dmin,long dmax,char *name,double km_in, double thick) { int i,j,k,l,m,n; long drow=ROW,dcol=COL; int i0,j0,i1,j1,row,col; double lat,lon,x,y,z,rho,ln1=lon1,ln2=lon2; long offset,pts; long ij[2][2][2]; /* cube [depth][col][row] */ FILE *fpin,*fpout,*fplbl,*fpdat; long drange,dval,dnum=0; char string[100]; double scale=cos(clat*DEG_RAD); long nm,cl,rw,lr,lc,lrow,lcol,l2=2,l1=1,l3=3,l4=4; drange=dmax-dmin; i0=(90.0-lat2)*12.0; i1=(90.0-lat1)*12.0; if(lon1<0.0) lon1+=360.0; j0=lon1*(double)12.0; if(lon2<0.0) lon2+=360.0; j1=lon2*(double)12.0; row=i1-i0+1; col=j1-j0+1; sprintf(string,"elev.lbl"); fplbl=fopen(string,"wt"); if(!fplbl) { printf("Could not open '%s' to write.\n\n",string); exit(0); } else { fprintf(fplbl,"FILE_TYPE = IMAGE\n"); fprintf(fplbl,"IMAGE_LINES = %4d\n",row); fprintf(fplbl,"LINE_SAMPLES = %4d\n",col); fprintf(fplbl,"IMAGE_POINTER = 'elev.dat'\n"); fclose(fplbl); } fclose(fplbl); sprintf(string,"elev.dat"); fpdat=fopen(string,"wb"); if(!fpdat) { printf("Could not open '%s' to write.\n\n",string); exit(0); } offset=(i0*dcol+(long)j0)*2; lat2=(double)90.0-(double)i0/12.0; lat1=(double)90.0-(double)i1/12.0; lon1=(double)j0/(double)12.0; lon2=(double)j1/(double)12.0; fpin=fopen("globe16.dat","rb"); if(!fpin) { printf("Could not open 'globe16.dat' to read.\n\n"); exit(0); } fpout=fopen(name,"wt"); if(!fpout) { printf("Could not open '%s' to write.\n\n",name); exit(0); } fprintf(fpout,"# lat = %lf to %lf\n",lat1,lat2); fprintf(fpout,"# lon = %lf to %lf\n",ln1,ln2); fprintf(fpout,"# central lat = %lf\n",clat); fprintf(fpout,"# vertical exageration = %lf\n",r); fprintf(fpout,"# horizontal scale = %7.3lf km/in\n",(double)1.0/km_in); fprintf(fpout,"# flat skin model\n"); fprintf(fpout,"# skin thickness = %6.3lf in\n",thick); fprintf(fpout,"# array size = %d rows x %d cols\n",row,col); fprintf(fpout,"# %ld verticies\n",(long)row*(long)col*(long)2); fprintf(fpout,"# %ld triangles\n",(long)4*((long)row*(long)col-(long)1)); fprintf(fpout,"g skin\n"); fseek(fpin,offset,SEEK_SET); for(i=0;i=COL) { printf("maximum latitude is not valid.\n\n"); return(-1); } i1=(90.0-lat1)*12.0; if(i1<0||i1>=COL) { printf("minimum latitude is not valid.\n\n"); return(-1); } if(lon1<0.0) lon1+=360.0; j0=lon1*(double)12.0; if(j0<0||j0>=COL) { printf("minimum longitude is not valid.\n\n"); return(-1); } if(lon2<0.0) lon2+=360.0; j1=lon2*(double)12.0; if(j1<0||j1>=COL) { printf("maximum longitude is not valid.\n\n"); return(-1); } row=i1-i0+1; col=j1-j0+1; if(row<0||row>ROW) { printf("Latitude range is not valid.\n\n"); printf( "You may have crossed the 0 deg meridian which is not allowed.\n\n"); return(-1); } if(col<0||col>COL) { printf("longitude range is not valid.\n\n"); return(-1); } printf("Processing %d rows and %d columns\n",row,col); pts=(long)row*(long)col+(long)((row-1)*2)+(long)((col-1)*2); offset=(i0*dcol+(long)j0)*2; lat2=(double)90.0-(double)i0/12.0; lat1=(double)90.0-(double)i1/12.0; lon1=(double)j0/(double)12.0; lon2=(double)j1/(double)12.0; fpin=fopen("globe16.dat","rb"); if(!fpin) { printf("Could not open 'globe16.dat' to read.\n\n"); exit(0); } fseek(fpin,offset,SEEK_SET); for(i=0;i*max) *max=le; if(le<*min) *min=le; } } printf("\n"); if(fpin) fclose(fpin); } /********************************************************************** ** ** bottom thickness is in inches ** **********************************************************************/ int wf_flat(double lat1,double lat2,double lon1,double lon2, double clat,double r,long dmin,long dmax,char *name,double km_in, double bottom_thick) { int i,j,k,m,n; long drow=ROW,dcol=COL; int i0,j0,i1,j1,row,col; double lat,lon,x,y,z,rho,ln1=lon1,ln2=lon2; long offset,pts,ij[2][2]; FILE *fpin,*fpout,*fplbl,*fpdat; long drange,dval,dnum=0; char string[100]; double scale=cos(clat*DEG_RAD); long nm,cl,rw; drange=dmax-dmin; i0=(90.0-lat2)*12.0; i1=(90.0-lat1)*12.0; if(lon1<0.0) lon1+=360.0; j0=lon1*(double)12.0; if(lon2<0.0) lon2+=360.0; j1=lon2*(double)12.0; row=i1-i0+1; col=j1-j0+1; sprintf(string,"elev.lbl"); fplbl=fopen(string,"wt"); if(!fplbl) { printf("Could not open '%s' to write.\n\n",string); exit(0); } else { fprintf(fplbl,"FILE_TYPE = IMAGE\n"); fprintf(fplbl,"IMAGE_LINES = %4d\n",row); fprintf(fplbl,"LINE_SAMPLES = %4d\n",col); fprintf(fplbl,"IMAGE_POINTER = 'elev.dat'\n"); fclose(fplbl); } fclose(fplbl); sprintf(string,"elev.dat"); fpdat=fopen(string,"wb"); if(!fpdat) { printf("Could not open '%s' to write.\n\n",string); exit(0); } pts=(long)row*(long)col+(long)((row-1)*2)+(long)((col-1)*2); offset=(i0*dcol+(long)j0)*2; lat2=(double)90.0-(double)i0/12.0; lat1=(double)90.0-(double)i1/12.0; lon1=(double)j0/(double)12.0; lon2=(double)j1/(double)12.0; fpin=fopen("globe16.dat","rb"); if(!fpin) { printf("Could not open 'globe16.dat' to read.\n\n"); exit(0); } fpout=fopen(name,"wt"); if(!fpout) { printf("Could not open '%s' to write.\n\n",name); exit(0); } fprintf(fpout,"# lat = %lf to %lf\n",lat1,lat2); fprintf(fpout,"# lon = %lf to %lf\n",ln1,ln2); fprintf(fpout,"# central lat = %lf\n",clat); fprintf(fpout,"# vertical exageration = %lf\n",r); fprintf(fpout,"# %7.3lf km/in\n",(double)1.0/km_in); fprintf(fpout,"# Z-Range %ld to %ld\n",dmin,dmax); fprintf(fpout,"# Z-Mid = 0\n"); fprintf(fpout,"# %6.3lf in bottom thickness.\n",bottom_thick); fprintf(fpout,"g globe\n"); fprintf(fpout,"# %d rows x %d cols\n",row,col); fprintf(fpout,"g\n"); fseek(fpin,offset,SEEK_SET); for(i=0;i0;j--) { lon=(lon1+(double)j/12.0); x=(lon-lon1)/(double)360.0*E_CIR*scale*km_in-4.5; fprintf(fpout,"v %12.6lf %12.6lf %12.6lf\n",x,y,z); } j=0; lon=(lon1+(double)j/12.0); x=(lon-lon1)/(double)360.0*E_CIR*scale*km_in-4.5; for(i=rw;i>0;i--) { lat=(lat2-(double)i/12.0); y=-(lat2-lat)/(double)360.0*E_CIR*km_in-4.5; fprintf(fpout,"v %12.6lf %12.6lf %12.6lf\n",x,y,z); } fprintf(fpout,"# %ld vertices\n",pts); fprintf(fpout,"# lat = %lf to %lf\n",lat1,lat2); fprintf(fpout,"# lon = %lf to %lf\n",lon1,lon2); fprintf(fpout,"# earth radius = %lf\n",r); fprintf(fpout,"g globe\n"); for(i=1;ipts) ij[0][0]=nm; ij[1][0]=nm+cl*2+rw+i; fprintf(fpout,"f %ld %ld %ld\n",ij[1][0],ij[0][1],ij[0][0]); fprintf(fpout,"f %ld %ld %ld\n",ij[1][0],ij[1][1],ij[0][1]); } /* make bottom */ ij[0][0]=nm; ij[0][1]=nm+cl; ij[1][1]=nm+cl+rw; ij[1][0]=nm+cl*2+rw; fprintf(fpout,"f %ld %ld %ld\n",ij[1][0],ij[0][0],ij[0][1]); fprintf(fpout,"f %ld %ld %ld\n",ij[1][0],ij[0][1],ij[1][1]); pts=(long)(row-1)*(long)(col-1)*2+rw*4+cl*4+2; fprintf(fpout,"# %ld elements\n",pts); fclose(fpin); fclose(fpout); fclose(fpdat); } /********************************************************************** ** ** ** **********************************************************************/ int wf(double lat1,double lat2,double lon1,double lon2,double r) { int i,j,k,m,n; long drow=ROW,dcol=COL; int i0,j0,i1,j1,row,col; double lat,lon,x,y,z,rho; long offset,pts,ij[2][2]; FILE *fpin,*fpout,*fplbl,*fpdat; long dmax=9000,dmin=-12000,drange,dval,dnum=0; char string[100]; drange=dmax-dmin; i0=(90.0-lat2)*12.0; i1=(90.0-lat1)*12.0; if(lon1<0.0) lon1+=360.0; j0=lon1*(double)12.0; if(lon2<0.0) lon2+=360.0; j1=lon2*(double)12.0; row=i1-i0+1; col=j1-j0+1; sprintf(string,"elev.lbl"); fplbl=fopen(string,"wt"); if(!fplbl) { printf("Could not open '%s' to write.\n\n",string); exit(0); } else { fprintf(fplbl,"FILE_TYPE = IMAGE\n"); fprintf(fplbl,"IMAGE_LINES = %4d\n",row); fprintf(fplbl,"LINE_SAMPLES = %4d\n",col); fprintf(fplbl,"IMAGE_POINTER = 'elev.dat'\n"); fclose(fplbl); } fclose(fplbl); sprintf(string,"elev.dat"); fpdat=fopen(string,"wb"); if(!fpdat) { printf("Could not open '%s' to write.\n\n",string); exit(0); } pts=(long)row*(long)col; offset=(i0*dcol+(long)j0)*2; lat2=(double)90.0-(double)i0/12.0; lat1=(double)90.0-(double)i1/12.0; lon1=(double)j0/(double)12.0; lon2=(double)j1/(double)12.0; fpin=fopen("globe16.dat","rb"); if(!fpin) { printf("Could not open 'globe16.dat' to read.\n\n"); exit(0); } fpout=fopen("globe.wvf","wt"); if(!fpout) { printf("Could not open 'globe.wvf' to write.\n\n"); exit(0); } fprintf(fpout,"# lat = %lf to %lf\n",lat1,lat2); fprintf(fpout,"# lon = %lf to %lf\n",lon1,lon2); fprintf(fpout,"# earth radius = %lf\n",r); fprintf(fpout,"g globe\n"); fprintf(fpout,"g\n"); fseek(fpin,offset,SEEK_SET); for(i=0;imax) max=Elev[k]; dval=Elev[k]; dval-=dmin; dval*=255; E8[k]=dval/drange; } } fwrite((char *)Elev,sizeof(int),COL,fpout16); fwrite((char *)E8,sizeof(char),COL,fpout8); printf("%c%6d %6d %6d",cr,++l,min,max); }while(end==0); printf("\n\n%s max = %d min = %d\n\n",name,max,min); printf("number of points = %ld\n",dnum); }