/* strmflow.c sf1.bat = cl /AL strmflow.c julday vimage3 graphlib */ #include #include #include #include "mouseg.h" #include "vimage.h" #include "font.h" #define BUFF 0 #define D_GREY 1 #define M_GREY 2 #define L_GREY 3 #define WHITE 4 #define RED 5 #define ORANGE 6 #define YELLOW 7 #define M_BUFF 8 #define CYAN 9 #define BLUE 10 #define L_BUFF 11 #define BUFF2 12 #define BROWN 13 #define D_BLUE 14 #define BLACK 15 int day_1[2][12]= { { 0,31,61,92,123,151,182,212,243,273,304,335}, { 0,31,61,92,123,152,183,213,244,274,305,336} }; int day_2[2][13]= { { 30,60,91,122,150,181,211,242,272,303,334,364}, { 30,60,91,122,151,182,212,243,273,304,335,365} }; char *MName[12]= { "October","November","December","January","February","March", "April","May","June","July","August","September" }; struct Color Vcolor[16]= { { 105, 90, 75}, { 46, 46, 46}, { 128,128,128}, { 191,191,191}, { 255,255,255}, { 255, 0, 0}, { 255,128, 0}, { 191,191, 0}, { 110, 95, 78}, { 0,191,191}, { 40, 40,255}, { 128,110, 91}, { 95, 81, 67}, { 96, 28, 14}, { 0, 30, 90}, { 0, 0, 0} }; int ScreenXs,ScreenYs; int Mouse=0; float Data[31][12]; float Flow[366]; struct stat { char name[50]; float area,elev; float lat,lon; int numyr,yr1,yrlast; float maxflow,minflow,msngval; float momaxmean,mominmean; }S; unsigned char Buffer[1024]; int plot_data(); int plot_file(char *name,FILE *fp); int plot_daily(int xc,int yc,int xs,int ys,FILE *fp,int yr1,int yr2,char iop); int make_binary(); int process_adv(char *name,FILE *fpadv); long jday(int mo,int da,int yr); int set_lut(); int video_off(); int video_on(); int plot_month(int xc,int yc,int xs,int ys,FILE *fp,int yr1,int yr2); int xor_line(int plane,int x1,int y1,int x2,int y2,unsigned char *buffer); int plot_map(int xs,int ys); int plot_line(char *name,int color,float maxlat,float minlon,float pix); main(int agrc,char *argv[]) { char ans; if(mouse_initialize(4)) { printf("Mouse initialized.\n\n"); Mouse=4; /* sensitivity set to maximum (1 is minimum) */ } else { printf( "\n\n\n\nNO MOUSE FOUND -- YOU MUST HAVE A MOUSE TO RUN THIS PROGRAM\n\n\n"); exit(0); } mouse_vertical_range(0,ScreenYs-1); mouse_horizontal_range(0,ScreenXs-1); do { printf(" b -- make binary files\n"); printf(" p -- plot\n"); printf("\n x -- exit program\n\n"); ans=getch(); if(ans=='b') make_binary(); if(ans=='p') plot_data(); }while(ans!='x'&&ans!=27); } /********************************************************************** ** ** ** **********************************************************************/ int plot_data() { int i,j,k; int num=0; FILE *fp; char name[100],string[100]; while((num=get_file_name("*.bsf",name,num))>=0) { fp=fopen(name,"rb"); if(fp) { plot_file(name,fp); fclose(fp); } else printf("Could not open '%s' to read data.\n\n",name); } } /********************************************************************** ** ** ** **********************************************************************/ int plot_file(char *name,FILE *fp) { int i,j,k; int xc1=319,yc1= 15,xs1=320,ys1=120; int xc2=319,yc2=135,xs2=320,ys2=120; int xc3= 0,yc3=312,xs3=640,ys3=140,yr1,yr2; char ans,string[100]; char iop='l'; fread((char *)&S,sizeof(struct stat),1,fp); video_on(); plot_map(310,310); yr1=(S.yrlast+S.yr1)/2-1; yr2=(S.yrlast+S.yr1)/2+1; plot_daily(xc1,yc1,xs1,ys1,fp,S.yr1,S.yrlast,iop); plot_daily(xc3,yc3,xs3,ys3,fp,yr1,yr2,iop); plot_month(xc2,yc2,xs2,ys2,fp,S.yr1,S.yrlast); plot_font_h(L_GREY,320,260,S.name,2,Font); sprintf(string,"Drainage Area = %0.1f Elevation = %0.1f",S.area,S.elev); plot_font_h(L_GREY,320,275,string,2,Font); sprintf(string,"Lat = %0.5f Lon = %0.5f",S.lat,S.lon); plot_font_h(L_GREY,320,290,string,2,Font); plot_font_h(L_GREY,0,464, "<--> Change years Up=less Dn=more l=log n=normal", 2,Font); do { ans=getch(); if(ans=='l'&&iop=='n') { iop='l'; plot_daily(xc1,yc1,xs1,ys1,fp,S.yr1,S.yrlast,iop); plot_daily(xc3,yc3,xs3,ys3,fp,yr1,yr2,iop); } if(ans=='n'&&iop=='l') { iop='n'; plot_daily(xc1,yc1,xs1,ys1,fp,S.yr1,S.yrlast,iop); plot_daily(xc3,yc3,xs3,ys3,fp,yr1,yr2,iop); } if(ans==0) { ans=getch(); if(ans==77&&yr2S.yr1) { yr1-=1; yr2-=1; } if(ans==72&&yr2>yr1) yr2-=1; if(ans==80) { yr1-=1; yr2+=1; } if(yr2S.yrlast) yr2=S.yrlast; plot_daily(xc3,yc3,xs3,ys3,fp,yr1,yr2,iop); } }while(ans!=27); video_off(); } /********************************************************************** ** ** ** **********************************************************************/ int plot_map(int xs,int ys) { int i,j,k; char string[100],name[100]; int color; double pix,lat,lon; int screenxs=ScreenXs,screenys=ScreenYs; FILE *fplin,*fp,*fphdr; ScreenXs=xs; ScreenYs=ys; fplin=fopen("hydro.lin","rt"); if(!fplin) { ScreenXs=screenxs; ScreenYs=screenys; return(-1); } fscanf(fplin,"%lf%lf%lf",&pix,&lat,&lon); while(fscanf(fplin,"%s%d",name,&color)==2) { plot_line(name,color,lat,lon,pix); } ScreenXs=screenxs; ScreenYs=screenys; } /********************************************************************** ** ** ** **********************************************************************/ int plot_line(char *name,int color,float maxlat,float minlon,float pix) { int i,j,k; int secnum,numpt,numsec,doit; int ix,iy,ixo,iyo; FILE *fp,*fphdr; char string[100]; double lat; float dely=111.0/pix,delx; float minlat=maxlat-(float)ScreenYs/dely; float maxlon; float latlon[2],mll[4],mnln,mxln,mnlt,mxlt; long offset; lat=(maxlat+minlat)/2.0; delx=dely*cos(lat); maxlon=minlon+(float)ScreenXs/delx; sprintf(string,"%s.hdr",name); fphdr=fopen(string,"rb"); if(!fphdr) return(0); sprintf(string,"%s.bin",name); fp=fopen(string,"rb"); if(!fp) { fclose(fphdr); return(-2); } fread((char *)&numsec,sizeof(int),1,fphdr); fread((char *)&numsec,sizeof(int),1,fp); for(j=0;jmaxlon||mnlt>maxlat||mxln25) size=3; delyr=(float)xs/(float)numyr; delmo=delyr/12.0; delda=delyr/366.0; min=S.mominmean; range=(S.momaxmean-S.mominmean)/(float)(ys-1); paint_box(0,BUFF,Buffer,xc,yc,xs,ys+15); ixo=iyo=-1; for(i=0;iS.mominmean) { iy=(float)(yc+ys)- (dval-min)/range; plotln(0,xc,iy,xc+xs-1,iy,L_BUFF); sprintf(string,"%0.0lf",dval); plot_font_h(L_GREY,xc+3,iy-4/size,string,3,Font); sprintf(string,"%10.0lf",dval); plot_font_h(L_GREY,xc+xs-53,iy-4/size,string,3,Font); } dval+=dely; }while(dval0.0) { mean/=num; x=(float)(year-yr1)*delyr+(float)j*delmo+delmo/2; ix=x+xc; iy=(float)(yc+ys)- (mean-S.mominmean)/(S.momaxmean-S.mominmean)*(float)ys; if(ixo>=0) plotln(0,ixo,iyo,ix,iy,D_BLUE); ixo=ix; iyo=iy; } } } } /********************************************************************** ** ** ** **********************************************************************/ int plot_daily(int xc,int yc,int xs,int ys,FILE *fp,int yr1,int yr2,char iop) { int i,j,k,da; int ix,iy,size=2,ixo,iyo; float x,y; float delyr,delda,delmo,mean,num; float range,min,srange,dely=200000; char string[100]; int leap,year,numyr,yearo=-1; double dval; ys-=15; if(S.minflow<=0.0) iop='n'; if(iop=='l') { min=log((double)S.minflow); range=(log((double)S.maxflow)-log((double)S.minflow))/(float)(ys-1); } else { min=S.minflow; range=(S.maxflow-S.minflow)/(float)(ys-1); } numyr=yr2-yr1+1; if(numyr>25) size=3; delyr=(float)xs/(float)numyr; delda=delyr/366.0; delmo=delyr/12.0; paint_box(0,BUFF,Buffer,xc,yc,xs,ys+15); for(i=0;iS.minflow) { iy=(float)(yc+ys)- (log(dval)-min)/range; plotln(0,xc,iy,xc+xs-1,iy,L_BUFF); sprintf(string,"%0.0lf",dval); plot_font_h(L_GREY,xc+3,iy-4/size,string,3,Font); sprintf(string,"%10.0lf",dval); plot_font_h(L_GREY,xc+xs-53,iy-4/size,string,3,Font); } dval*=10; }while(dvalS.minflow) { iy=(float)(yc+ys)- (dval-min)/range; plotln(0,xc,iy,xc+xs-1,iy,L_BUFF); sprintf(string,"%0.0lf",dval); plot_font_h(L_GREY,xc+3,iy-4/size,string,3,Font); sprintf(string,"%10.0lf",dval); plot_font_h(L_GREY,xc+xs-53,iy-4/size,string,3,Font); } dval+=dely; }while(dval0&&year-yearo>1) ixo=-1; yearo=year; fread((char *)Flow,sizeof(float),366,fp); if(year>=yr1&&year<=yr2) { da=0; for(j=0;j<12;j++) { leap=year%4==0&&year%100!=0||year%400==0; for(k=day_1[leap][j];k<=day_2[leap][j];k++) { if(Flow[k]!=S.msngval) { x=(float)(year-yr1)*delyr+(float)da*delda+delda/2.0; ix=x+xc; if(iop=='l') iy=(float)(yc+ys)- (log((double)Flow[k])-min)/range; else iy=(float)(yc+ys)- (Flow[k]-min)/range; if(ixo>=0) plotln(0,ixo,iyo,ix,iy,D_BLUE); ixo=ix; iyo=iy; } da+=1; } } } } } /********************************************************************** ** ** ** **********************************************************************/ int make_binary() { int i,j,k; int num=0,hit; char string[250],name[100],str1[50]; FILE *fpadv,*fpbsf,*fpnam; while((num=get_file_name("*.adv",name,num))>=0) { fpadv=fopen(name,"rt"); if(fpadv) { for(k=0;kS.maxflow) S.maxflow=Flow[k]; if(Flow[k]0.0) { mean/=num; if(c==0&&j==0) { S.mominmean=mean; S.momaxmean=mean; } else { if(mean>S.momaxmean) S.momaxmean=mean; if(meanxs) size=ys; ReadLine(y1,x1,y2,x2,Buffer); for(j=0;j