/* trigrid.c tg1.bat = cl /AL trigrid.c proj1 getfile3 trigrid [input file name] [output file name] where '.lbs' file format is: FILE_TYPE = ELEVATION_ARRAY IMAGE_LINES = 120 LINE_SAMPLES = 120 UPPER_LEFT_LAT = 36.25000 UPPER_LEFT_LON = -122.75000 LOWER_RIGHT_LAT = 36.01200 (optional) LOWER_RIGHT_LON = -122.51200 (optional) DELTA_LAT = 500 points/degree DELTA_LON = 500 points/degree NUMBER_OF_LAT = 120 NUMBER_OF_LON = 120 MAXIMUM_Z = -2021.94263 (optional) MINIMUM_Z = -3482.91040 (optional) SPLINE_FLEXIBILITY = 0.20000 (optional) MISSING_DATA_VALUE = 0.000000 (optional) DATA_TYPE = float DATA_SIZE = 4 bytes DATA_FILE_POINTER = 'm102.D64' INPUT_DATA_NAME = 'pacific.D32' (optional) */ #include #include #include #include "proj1.h" #include "nomouse.h" #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define E_RAD 6400 #define E_CIR 40212 #define ROW 2060 #define COL 4320 char Text[20][80]; char *Path[10]; int NumPath=0; struct control Map; struct grid_stat { double maxlat,minlat,maxlon,minlon; double maxz,minz; double dellat,dellon; /* array size */ double latspace,lonspace; /* line spacing */ double scale; int numlat,numlon; char datafile[100]; char sourcefile[100]; double flex; double msng_val; char msng; int type,size; /* type -- 1 = unsigned char (1 byte) */ /* type -- 2 = char (1 byte) */ /* type -- 3 = unsigned short (2 bytes) */ /* type -- 4 = short (2 bytes) */ /* type -- 5 = unsigned long (4 bytes) */ /* type -- 6 = long (4 bytes) */ /* type -- 7 = float (4 bytes) */ /* type -- 8 = double (8 bytes) */ }Fs; union Data { unsigned char uc[32768]; char c[32768]; short us[16384]; short s[16384]; unsigned long ul[8192]; long l[8192]; float f[8192]; double d[4096]; }D; double huge Z[3][4096]; long N[3][4096]; int Num_Data=0; 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); int read_lbs(char *name,struct grid_stat *fs); int make_wvf(char *name,struct grid_stat fs); int write_fs(FILE *fpw,struct grid_stat fs); int read_data(FILE *fpdat,struct grid_stat fs,double *Z); FILE *fopen_path(char *filename,char *type); main(int argc,char *argv[]) { int i,j,k; char inname[100],outname[100]; NumPath=argc; for(i=1;i1) { strcpy(inname,argv[1]); } else if(get_file_name("*.lbs",inname)<0) exit(0); for(k=0;ky1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(yy1)y1=y;if(x>x2)x2=x;if(y0.0) fprintf(fpv, "# Double sided figure thickness = %lf in (%lf km)\n",thick,thick*scale); } printf("Writing Verticies i 'V' and tiangles in 'W'\n"); lat=fs.maxlat; for(i=0;i<3;i++) { for(j=0;j0&& /* top left */ Z[idm1][j ]!=fs.msng_val&& Z[idm1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val)|| (j>0&& /* bottom left */ Z[idp1][j ]!=fs.msng_val&& Z[idp1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val)) { ll2xy(lat,lon,&x,&y,Map); z=Z[id][j]; N[id][j]=nv++; fprintf(fpv,"v %lf %lf %lf\n", (x-mx)*scale,(y-my)*scale,(z-mz)*scale*vscale); if(thick>0.0) fprintf(fpv,"v %lf %lf %lf\n", (x-mx)*scale,(y-my)*scale,(z-mz)*scale*vscale-thick); if(j>0&& /* top left box present */ Z[idm1][j ]!=fs.msng_val&& Z[idm1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val) { if(thick==0.0) { fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j ]+1,N[idm1][j-1]+1,N[id ][j-1]+1); fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j ]+1,N[id ][j-1]+1,N[id ][j ]+1); } else { fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j ]*2+1,N[idm1][j-1]*2+1,N[id ][j-1]*2+1); fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j ]*2+1,N[id ][j-1]*2+1,N[id ][j ]*2+1); fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j-1]*2+2,N[idm1][j ]*2+2,N[id ][j-1]*2+2); fprintf(fpw,"f %ld %ld %ld\n", N[id ][j-1]*2+2,N[idm1][j ]*2+2,N[id ][j ]*2+2); } } if(thick!=0.0) /* do edges */ { if((i>0&&j0&& /* top left box present */ Z[idm1][j ]!=fs.msng_val&& Z[idm1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val)&& (j==fs.numlon-1|| /* top right box missing */ Z[idm1][j+1]==fs.msng_val|| Z[id ][j+1]==fs.msng_val))/* edge right side */ { fprintf(fpw,"f %ld %ld %ld\n", N[idm1][j ]*2+2,N[idm1][j ]*2+1,N[id ][j ]*2+2); fprintf(fpw,"f %ld %ld %ld\n", N[id ][j ]*2+2,N[idm1][j ]*2+1,N[id][j ]*2+1); } if((j>0&& /* top left box present */ Z[idm1][j ]!=fs.msng_val&& Z[idm1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val)&& (i==fs.numlat-1|| /* bottom left box missing */ Z[idp1][j ]==fs.msng_val|| Z[idp1][j-1]==fs.msng_val))/* edge bottom side */ { fprintf(fpw,"f %ld %ld %ld\n", N[id ][j ]*2+1,N[id ][j-1]*2+1,N[id ][j-1]*2+2); fprintf(fpw,"f %ld %ld %ld\n", N[id ][j ]*2+1,N[id ][j-1]*2+2,N[id ][j ]*2+2); } if((j>0&& /* bottom left box present */ Z[idp1][j ]!=fs.msng_val&& Z[idp1][j-1]!=fs.msng_val&& Z[id ][j-1]!=fs.msng_val)&& ( /* top left box missing */ Z[idm1][j ]==fs.msng_val|| Z[idm1][j-1]==fs.msng_val))/* edge top side */ { fprintf(fpw,"f %ld %ld %ld\n", N[id ][j-1]*2+1,N[id ][j ]*2+1,N[id ][j-1]*2+2); fprintf(fpw,"f %ld %ld %ld\n", N[id ][j-1]*2+2,N[id ][j ]*2+1,N[id ][j ]*2+2); } } } } lon+=fs.lonspace; } lat-=fs.latspace; } if(fs.msng!=0) { if(thick==0.0) printf("\n\nThere are %ld valid vertexes out of %ld\n",nv,tnv); else printf("\n\nThere are %ld valid vertexes out of %ld\n",nv*2,tnv*2); } else printf("/n/nThere are %ld vertiexes\n",nv,tnv); printf("Creating 'WVF' file.\n\n"); fclose(fpv); fclose(fpw); fclose(fpdat); sprintf(string,"%s.v",name); fpv=fopen_path(string,"rt"); if(!fpv) { printf("Could not open '%s' to read.\n\n"); exit(0); } while(fgets(string,100,fpv)) fprintf(fpwvf,"%s",string); fclose(fpv); sprintf(string,"%s.w",name); fpw=fopen_path(string,"rt"); if(!fpw) { printf("Could not open '%s' to read.\n\n"); exit(0); } while(fgets(string,100,fpw)) fprintf(fpwvf,"%s",string); flushall(); fclose(fpw); printf("Completed '%s.wvf'\n",name); return(1); } /********************************************************************** ** ** ** **********************************************************************/ int read_data(FILE *fpdat,struct grid_stat fs,double *z) { int j; if(fs.type==1) { if(fread((char *)D.uc,sizeof(char),fs.numlon,fpdat)(char)0) fprintf(fpv,"# Missing Value = %lf\n",fs.msng_val); if(fs.flex>-1.0) fprintf(fpv,"# Spline Fleibility = %f\n",fs.flex); if(fs.type==1)fprintf(fpv,"# Data Type = 'unsigned char (1 byte)'\n"); if(fs.type==2)fprintf(fpv,"# Data Type = 'char (1 byte)'\n"); if(fs.type==3)fprintf(fpv,"# Data Type = 'unsigned short (2 bytes)'\n"); if(fs.type==4)fprintf(fpv,"# Data Type = 'short (2 bytes)'\n"); if(fs.type==5)fprintf(fpv,"# Data Type = 'unsigned long (4 bytes)'\n"); if(fs.type==6)fprintf(fpv,"# Data Type = 'long (4 bytes)'\n"); if(fs.type==7)fprintf(fpv,"# Data Type = 'float (4 bytes)'\n"); if(fs.type==8)fprintf(fpv,"# Data Type = 'double (8 bytes)'\n"); fprintf(fpv,"# Vector Source File = '%s'\n",fs.sourcefile); fprintf(fpv,"# Data File = '%s'\n",fs.datafile); } /********************************************************************** ** ** ** **********************************************************************/ int read_lbs(char *name,struct grid_stat *fs) { int i,j,k; FILE *fp; char string[100],str1[50],str2[50],str3[50],str4[50]; char *type; sprintf(string,"%s.lbs",name); fp=fopen_path(string,"rt"); if(!fp) { printf("Could not open '%s' to read label information.\n\n",string); exit(0); } fs->maxlat=-360.0; fs->maxlon=-360.0; fs->minlat=360.0; fs->minlon=360.0; fs->dellat=0.0; fs->dellon=0.0; fs->latspace=0.0; fs->lonspace=0.0; fs->scale=0.0; fs->numlat=0; fs->numlon=0; fs->size=0; fs->type=0; fs->flex=-1.0; fs->msng_val=-999999.0; fs->msng=0; while(fgets(string,100,fp)) { sscanf(string,"%s%s%s%s",str1,str2,str3,str4); if(strcmpi(str1,"MISSING_DATA_VALUE")==0) { if(sscanf(str3,"%lf",&fs->msng_val)<1) { printf("Invalid MISSING_DATA_VALUE '%s'\n\n",str3); exit(0); } fs->msng=1; printf("MISSING_DATA_VALUE = %lf\n",fs->msng_val); } if(strcmpi(str1,"IMAGE_LINES")==0) { if(sscanf(str3,"%d",&fs->numlat)<1) { printf("Invalid IMAGE_LINES '%s'\n\n",str3); exit(0); } printf("IMAGE_LINES = %d\n",fs->numlat); } if(fs->numlat==0&&strcmpi(str1,"NUMBER_OF_LAT")==0) { if(sscanf(str3,"%d",&fs->numlat)<1) { printf("Invalid NUMBER_OF_LAT'%s'\n\n",str3); exit(0); } printf("NUMBER_OF_LAT = %d\n",fs->numlat); } if(strcmpi(str1,"LINE_SAMPLES")==0) { if(sscanf(str3,"%d",&fs->numlon)<1) { printf("Invalid LINE_SAMPLES '%s'\n\n",str3); exit(0); } printf("LINE_SAMPLES = %d\n",fs->numlon); } if(fs->numlon==0&&strcmpi(str1,"NUMBER_OF_LON")==0) { if(sscanf(str3,"%d",&fs->numlon)<1) { printf("Invalid NUMBER_OF_LON'%s'\n\n",str3); exit(0); } printf("NUMBER_OF_LON = %d\n",fs->numlon); } if(strcmpi(str1,"UPPER_LEFT_LAT")==0) { if(sscanf(str3,"%lf",&fs->maxlat)<1) { printf("Invalid UPPER_LEFT_LAT '%s'\n\n",str3); exit(0); } printf("UPPER_LEFT_LAT = %lf\n",fs->maxlat); } if(strcmpi(str1,"UPPER_LEFT_LON")==0) { if(sscanf(str3,"%lf",&fs->minlon)<1) { printf("Invalid UPPER_LEFT_LON '%s'\n\n",str3); exit(0); } printf("UPPER_LEFT_LON = %lf\n",fs->minlon); } if(strcmpi(str1,"LOWER_RIGHT_LAT")==0) { if(sscanf(str3,"%lf",&fs->minlat)<1) { printf("Invalid LOWER_RIGHT_LAT '%s'\n\n",str3); exit(0); } printf("LOWER_RIGHT_LAT = %lf\n",fs->minlat); } if(strcmpi(str1,"LOWER_RIGHT_LON")==0) { if(sscanf(str3,"%lf",&fs->maxlon)<1) { printf("Invalid LOWER_RIGHT_LON '%s'\n\n",str3); exit(0); } printf("LOWER_RIGHT_LON = %lf\n",fs->maxlon); } if(strcmpi(str1,"DELTA_LAT")==0) { if(sscanf(str3,"%lf",&fs->latspace)<1||fs->latspace<=0.0) { printf("Invalid DELTA_LAT '%s'\n\n",str3); exit(0); } if(strcmpi(str4,"points/degree")==0) fs->latspace=1.0/fs->latspace; printf("DELTA_LAT = %lf\n",fs->latspace); } if(strcmpi(str1,"DELTA_LON")==0) { if(sscanf(str3,"%lf",&fs->lonspace)<1||fs->lonspace<=0.0) { printf("Invalid DELTA_LON '%s'\n\n",str3); exit(0); } if(strcmpi(str4,"points/degree")==0) fs->lonspace=1.0/fs->lonspace; printf("DELTA_LON = %lf\n",fs->lonspace); } if(strcmpi(str1,"MAXIMUM_Z")==0) { if(sscanf(str3,"%lf",&fs->maxz)<1) { printf("Invalid MAXIMUM_Z '%s'\n\n",str3); exit(0); } printf("MAXIMUM_Z = %lf\n",fs->maxz); } if(strcmpi(str1,"MINIMUM_Z")==0) { if(sscanf(str3,"%lf",&fs->minz)<1) { printf("Invalid MINIMUM_Z '%s'\n\n",str3); exit(0); } printf("MINIMUM_Z = %lf\n",fs->minz); } if(strcmpi(str1,"DATA_FILE_POINTER")==0) { k=0; for(i=0;idatafile[k++]=str3[i]; fs->datafile[k]='\0'; printf("DATA_FILE_POINTER = '%s'\n",fs->datafile); } if(strcmpi(str1,"DATA_TYPE")==0) { strcpy(type,str3); printf("DATA_TYPE = '%s'\n",type); } if(strcmpi(str1,"DATA_SIZE")==0) { if(sscanf(str3,"%d",&fs->size)<1) { printf("Invalid DATA_SIZE '%s'\n\n",str3); exit(0); } printf("DATA_SIZE = %d\n",fs->size); } if(strcmpi(str1,"SPLINE_FLEXIBILITY")==0) { sscanf(str3,"%lf",&fs->flex); printf("SPLINE_FLEXIBILITY = %lf\n",fs->flex); } if(strcmpi(str1,"INPUT_DATA_NAME")==0) { strcpy(fs->sourcefile,str3); printf("INPUT_DATA_NAME = %s\n",fs->sourcefile); } } fclose(fp); if(strcmpi(type,"unsigned")==0&&fs->size==1) { fs->type=1; printf("TYPE = 'unsigned char'\n"); } if(strcmpi(type,"char")==0&&fs->size==1) { fs->type=2; printf("TYPE = 'char'\n"); } if(strcmpi(type,"unsigned")==0&&fs->size==2) { fs->type=3; printf("TYPE = 'unsigned short'\n"); } if(strcmpi(type,"short")==0&&fs->size==2) { fs->type=4; printf("TYPE = 'short'\n"); } if(strcmpi(type,"unsigned long")==0&&fs->size==4) { fs->type=5; printf("TYPE = 'unsigned long'\n"); } if(strcmpi(type,"long")==0&&fs->size==1) { fs->type=6; printf("TYPE = 'long'\n"); } if(strcmpi(type,"float")==0&&fs->size==4) { fs->type=7; printf("TYPE = 'float'\n"); } if(strcmpi(type,"double")==0&&fs->size==8) { fs->type=8; printf("TYPE = 'double'\n"); } if(fs->type==0) { printf("Invalid DATA_TYPE '%s' + %d bytes\n\n",type,fs->size); exit(0); } if(fs->minlat==360.0) { fs->minlat=fs->maxlat-(double)(fs->numlat-1)*fs->latspace; printf("LOWER_RIGHT_LAT = %lf\n",fs->minlat); } if(fs->maxlon==-360.0) { fs->maxlon=fs->minlon+(double)(fs->numlon-1)*fs->lonspace; printf("LOWER_RIGHT_LON = %lf\n",fs->maxlon); } fs->dellat=fs->maxlat-fs->minlat; fs->dellon=fs->maxlon-fs->minlon; printf("LAT_RANGE = %lf\n",fs->dellat); printf("LON_RANGE = %lf\n",fs->dellon); if(fs->numlat==0&&fs->dellat>0.0) { fs->numlat=(fs->dellat+fs->latspace/1000.0)/fs->latspace; printf("NUMBER_OF_LAT = %d\n",fs->numlat); } if(fs->numlon==0&&fs->dellon>0.0) { fs->numlon=(fs->dellon+fs->lonspace/1000.0)/fs->lonspace; printf("NUMBER_OF_LON = %d\n",fs->numlon); } if(fs->numlon==0) { printf("Could not find or calculate NUMBER_OF_LON\n"); exit(0); } if(fs->numlat==0) { printf("Could not find or calculate NUMBER_OF_LAT\n"); exit(0); } if(fs->minlon>=360.0) { printf("Could not find or calculate UPPER_LEFT_LON\n"); exit(0); } if(fs->maxlat<=-360.0) { printf("Could not find or calculate UPPER_LEFT_LAT\n"); exit(0); } if(fs->numlon==0) { printf("Could not find or calculate DELTA_LON\n"); exit(0); } if(fs->numlat==0) { printf("Could not find or calculate DELTA_LAT\n"); exit(0); } } /********************************************************************** ** ** ** **********************************************************************/ FILE *fopen_path(char *filename,char *type) { int i,j,k; FILE *fp; char string[100]; fp=fopen(filename,type); if(fp) return(fp); for(i=0;i