📄 vipick.c
字号:
#include "gridhd.h"#include "comva.h"#include "par.h"#include "xplot.h"#include <X11/Xatom.h>#include <X11/keysym.h>/* self-documentation */char *sdoc = "VIPICK - Velocity pick of uniformly-sampled VELAN function f(x1,x2)\n""\n""vipick n1= [optional parameters] <binaryfile\n""\n""See vpick for Documentation \n""\n"" author: Zhiming Li 10/3/91 \n""\n";/* define maximum number of interfaces and maximum number of picks per interface in IFILE */#define maxhs 128#define maxpks 4096/* functions defined and used internally */static void zoomBox (int x, int y, int w, int h, int xb, int yb, int wb, int hb, int nx, int ix, float x1, float x2, int ny, int iy, float y1, float y2, int *nxb, int *ixb, float *x1b, float *x2b, int *nyb, int *iby, float *y1b, float *y2b);static unsigned char *newInterpBytes (int n1in, int n2in, unsigned char *bin, int n1out, int n2out);void xMouseLoc(Display *dpy, Window win, XEvent event, int style, Bool show, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb);void xMousePrint(Display *dpy, Window win, XEvent event, int style, FILE *mpicksfp, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb, char *pcard, int ppos, float *zp, float *vp, int np, int fex, float *ztop, float *zbot, float *dvdz, int ia, int ivof);void xMousePicks(Display *dpy, Window win, XEvent event, int style, char *vpickcolor, char *vrefcolor, FILE *mpicksfp, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb, float *zp, float *vp, int *np, float *zr, float *vr, int nr, int pkey, GC gc, int *savebg, int ivmode, float *zptop, float *zpbot, float *ztop, float *zbot, float *v0, float *dvdz, float *vatop, float *vabot, int *ia, float *zpscrd, float *vpscrd, int npcrd, char *vpcrdcolor, float *zifile, float *vifile, int nzifile, int ivof);void viplot(Display *dpy, Window win, char *vicolor, int x, int y, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb, float *zp, float *vp, int np, float *zr, int nr, int ivmode, float *ztop, float *zbot, float *v0, float *dvdz, float *vatop, float *vabot, int ia, int ivof);static Display *dpy;static Window win;main (argc,argv)int argc; char **argv;{ int n1,n2,n1tic,n2tic,nfloats, i1,i2,grid1,grid2,style, n1c,n2c,i1beg,i1end,i2beg,i2end,i1c,i2c, nz,iz,i1step,i2step,verbose, xbox,ybox,wbox,hbox, xb,yb,wb,hb, xxb,yyb,wwb,hhb, x,y,width,height, i,j,nx,ny,nxb,nyb,ixb,iyb, imageOutOfDate,winwidth=-1,winheight=-1, showloc=0,ppos,np=0,nr=0,pkey,fex, ivgtype, nzvg, indxvg, savebg, nxvg, ivmode, ia, cdppre,icdppre,ii,jj,ih,ihfile, nhs, *npicks, *hnums, *difs, cdpxmin,cdpxmax,nzifile,indx,one,i2min,i2max, ivof, *cdpscrd, *npscrd, maxp=2048, maxcrds=8192, ncdpscrd=0, *isort; float labelsize,titlesize,perc,clip,bperc,wperc,bclip,wclip, d1,f1,d2,f2,*z,*temp,zscale,zoffset,zi, x1beg,x1end,x2beg,x2end, x1min,x1max,x2min,x2max, d1num,f1num,d2num,f2num, x1begb,x1endb,x2begb,x2endb, *zp,*vp,*zr,*vr, fzvg, dzvg, tmp, xcdp, *zptop, *zpbot, *ztop, *zbot, *v0, *dvdz, *vatop, *vabot, *xpicks,*zpicks,*veltops,*velbots, *dens,*qval,*pois, *velavgs,*dvdzs,avplo,avphi, xmin,xmax,zmin,zmax,vmin,vmax,dcdp, fcdpvg, dcdpvg, *zpscrd, *vpscrd, *zifile, *vifile, *zi2, zi21, zi2n; unsigned char *cz,*czp,*czb,*czbp,*czbi=NULL; char *label1="depth (or time)",*label2="velocity", title[80],*ttl, *labelfont="Erg14",*titlefont="Rom22", *styles="seismic",*grid1s="none",*grid2s="none", *labelcolor="blue",*titlecolor="red", *gridcolor="blue",*cmap="rgb",keybuf[256],*mpicks, *vrefcolor="green",*vpickcolor="red",*vpcrdcolor="purple", *ifile, hnames[maxhs][80], vtype[80],dunits[80],zattrib[80], *pcard="VELO", *vgfile="NONE", strppos[5]; FILE *infp=stdin, *mpicksfp, *vgfp, *ifilefp; int ierr; ghed gh;/* Display *dpy; Window win;*/ XEvent event; KeySym keysym; XComposeStatus keystat; XImage *image=NULL; GC gci; int scr; unsigned long black,white,pmin,pmax; /* initialize getpar */ initargs(argc,argv); askdoc(1); /* get parameters describing 1st dimension sampling */ if (!getparint("n1",&n1)) err("Must specify number of samples in 1st dimension!\n"); d1 = 1.0; getparfloat("d1",&d1); f1 = d1; getparfloat("f1",&f1); x1min = (d1>0.0)?f1:f1+(n1-1)*d1; x1max = (d1<0.0)?f1:f1+(n1-1)*d1; /* get parameters describing 2nd dimension sampling */ if (!getparint("n2",&n2)) { if (fseek(infp,0L,2)!=0) err("must specify n2 if in a pipe!\n"); nfloats = eftell(infp)/sizeof(float); efseek(infp,0L,0); n2 = nfloats/n1; } d2 = 1.0; getparfloat("d2",&d2); f2 = d2; getparfloat("f2",&f2); x2min = (d2>0.0)?f2:f2+(n2-1)*d2; x2max = (d2<0.0)?f2:f2+(n2-1)*d2; /* set up file to save mouse picks */ zpscrd = (float*) malloc(maxp*maxcrds*sizeof(float)); vpscrd = (float*) malloc(maxp*maxcrds*sizeof(float)); npscrd = (int*) malloc(maxcrds*sizeof(int)); cdpscrd = (int*) malloc(maxcrds*sizeof(int)); for(i1=0;i1<maxcrds;i1++) npscrd[i1]=0; if(!getparint("ivof",&ivof)) ivof=0; if (!getparstring("mpicks", &mpicks)) { mpicksfp = stderr; fex = 0; ncdpscrd=0; } else { /* if file exist */ if((mpicksfp = fopen(mpicks,"r"))!=NULL) { if(ivof==0) { veloread(mpicksfp, cdpscrd, zpscrd, vpscrd, &ncdpscrd, npscrd, maxp, maxcrds); } else { /* read in velf cards */ /* velfread(mpicksfp, cdpscrd, zpscrd, vpscrd, &ncdpscrd, npscrd, maxp, maxcrds); */ /* read in hanvel cards */ hvelread(mpicksfp, cdpscrd, zpscrd, vpscrd, &ncdpscrd, npscrd, maxp, maxcrds); } fseek(mpicksfp,0,SEEK_END); if(ftell(mpicksfp) == 0) { fex = 0; } else { fex = 1; } fclose(mpicksfp); mpicksfp = efopen(mpicks,"a"); } else { mpicksfp = efopen(mpicks,"w"); fex = 0; } } if (!getparint("ppos", &ppos)) ppos = 1; /* maxpks maximum */ zp = (float*) malloc(maxpks*sizeof(float)); vp = (float*) malloc(maxpks*sizeof(float)); zptop = (float*) malloc(maxpks*sizeof(float)); zpbot = (float*) malloc(maxpks*sizeof(float)); ztop = (float*) malloc(maxpks*sizeof(float)); zbot = (float*) malloc(maxpks*sizeof(float)); v0 = (float*) malloc(maxpks*sizeof(float)); dvdz = (float*) malloc(maxpks*sizeof(float)); vatop = (float*) malloc(maxpks*sizeof(float)); vabot = (float*) malloc(maxpks*sizeof(float)); zifile = (float*) malloc(maxpks*sizeof(float)); vifile = (float*) malloc(maxpks*sizeof(float)); nzifile = 0; /*read in ifile if present */ if (getparstring("ifile", &ifile)) { ifilefp = fopen(ifile,"r"); xpicks = (float *) malloc(maxhs*maxpks*sizeof(float)); zpicks = (float *) malloc(maxhs*maxpks*sizeof(float)); veltops = (float *) malloc(maxhs*maxpks*sizeof(float)); velbots = (float *) malloc(maxhs*maxpks*sizeof(float)); npicks = (int *) malloc(maxhs*sizeof(int)); hnums = (int *) malloc(maxhs*sizeof(int)); difs = (int *) malloc(maxhs*maxpks*sizeof(int)); velavgs = (float *) malloc(maxhs*maxpks*sizeof(float)); dvdzs = (float *) malloc(maxhs*maxpks*sizeof(float)); qval = (float *) malloc(maxhs*maxpks*sizeof(float)); dens = (float*) malloc(maxhs*maxpks*sizeof(float)); pois = (float *) malloc(maxhs*maxpks*sizeof(float)); for(ih=0;ih<maxhs;ih++) npicks[ih]=0; for(ih=0;ih<maxhs*maxpks;ih++) { veltops[ih]=0.; velbots[ih]=0.; difs[ih] = 0; velavgs[ih] = 0.; dvdzs[ih] = 0.; } nhs = 0; ifileread(ifilefp,&nhs,xpicks,zpicks,veltops,velbots,difs, dens,qval,pois, velavgs,dvdzs, (char*)hnames,hnums,npicks,maxhs,maxpks, &xmin,&xmax,&zmin,&zmax, &cdpxmin,&cdpxmax,&vmin,&vmax, vtype,dunits,zattrib,&dcdp,&ihfile); /* fprintf(stderr,"xmin=%f\n",xmin); fprintf(stderr,"xmax=%f\n",xmax); fprintf(stderr,"zmin=%f\n",zmin); fprintf(stderr,"zmax=%f\n",zmax); fprintf(stderr,"cdpxmin=%d\n",cdpxmin); fprintf(stderr,"cdpxmax=%d\n",cdpxmax); fprintf(stderr,"vmin=%f\n",vmin); fprintf(stderr,"vmax=%f\n",vmax); fprintf(stderr,"vtype=%s\n",vtype); fprintf(stderr,"dunits=%s\n",dunits); fprintf(stderr,"zattrib=%s\n",zattrib); fprintf(stderr,"dcdp=%f\n",dcdp); */ /* determine x location of cdp */ if(nhs>0) { xcdp=xmin+(ppos-cdpxmin)*(xmax-xmin)/(cdpxmax-cdpxmin); /* determine z positions of picks from ifile input */ nzifile = 0; one = 1; zi2 = (float *) malloc(maxpks*sizeof(float)); isort = (int *) malloc(maxpks*sizeof(int)); for(ih=0;ih<nhs;ih++) { if(xpicks[ih*maxpks]<=xcdp && npicks[ih]>1 && xcdp<=xpicks[ih*maxpks+npicks[ih]-1]) { /* if(npicks[ih]==2) { */ bisear_(&npicks[ih],&one, xpicks+ih*maxpks,&xcdp,&indx); zifile[nzifile] = zpicks[ih*maxpks+indx-1] + (xcdp- xpicks[ih*maxpks+indx-1]) * (zpicks[ih*maxpks+indx]- zpicks[ih*maxpks+indx-1])/ (xpicks[ih*maxpks+indx]- xpicks[ih*maxpks+indx-1]); /* not a good idea to use spline !!!! */ /* } else { zi21 = 0.; zi2n = 0.; spline_(xpicks+ih*maxpks,zpicks+ih*maxpks, &npicks[ih],&zi21,&zi2n,zi2); splint_(xpicks+ih*maxpks,zpicks+ih*maxpks,zi2, &npicks[ih],&xcdp,&zifile[nzifile]); } */ nzifile = nzifile + 1; } } /* sort zifile to ascending order */ for(iz=0;iz<nzifile;iz++) { isort[iz] = iz; zi2[iz] = zifile[iz]; } if(nzifile>0) qkisort(nzifile,zifile,isort); for(iz=0;iz<nzifile;iz++) zifile[iz] = zi2[isort[iz]]; free(isort); free(zi2); } } /* read binary data to be plotted */ nz = n1*n2; z = ealloc1float(nz); if (fread(z,sizeof(float),nz,infp)!=nz) err("error reading input file"); /* if necessary, determine clips from percentiles */ if (getparfloat("clip",&clip)) { bclip = clip; wclip = -clip; } if ((!getparfloat("bclip",&bclip) || !getparfloat("wclip",&wclip)) && !getparfloat("clip",&clip)) { perc = 100.0; getparfloat("perc",&perc); temp = ealloc1float(nz); for (iz=0; iz<nz; iz++) temp[iz] = z[iz]; if (!getparfloat("bclip",&bclip)) { bperc = perc; getparfloat("bperc",&bperc); iz = (nz*bperc/100.0); if (iz<0) iz = 0; if (iz>nz-1) iz = nz-1; qkfind(iz,nz,temp); bclip = temp[iz]; } if (!getparfloat("wclip",&wclip)) { wperc = 100.0-perc; getparfloat("wperc",&wperc); iz = (nz*wperc/100.0); if (iz<0) iz = 0; if (iz>nz-1) iz = nz-1; qkfind(iz,nz,temp); wclip = temp[iz]; } free1float(temp); } verbose = 1; getparint("verbose",&verbose); if (verbose) warn("bclip=%g wclip=%g",bclip,wclip); /* get colormap specification */ getparstring("cmap",&cmap); /* get axes parameters */ xbox = 50; getparint("xbox",&xbox); ybox = 50; getparint("ybox",&ybox); wbox = 700; getparint("wbox",&wbox); hbox = 800; getparint("hbox",&hbox); x1beg = x1min; getparfloat("x1beg",&x1beg); x1end = x1max; getparfloat("x1end",&x1end); d1num = 0.0; getparfloat("d1num",&d1num); f1num = x1min; getparfloat("f1num",&f1num); n1tic = 1; getparint("n1tic",&n1tic); getparstring("grid1",&grid1s); if (STREQ("dot",grid1s)) grid1 = DOT; else if (STREQ("dash",grid1s)) grid1 = DASH; else if (STREQ("solid",grid1s)) grid1 = SOLID; else grid1 = NONE; getparstring("label1",&label1); x2beg = x2min; getparfloat("x2beg",&x2beg); x2end = x2max; getparfloat("x2end",&x2end); d2num = 0.0; getparfloat("d2num",&d2num); f2num = 0.0; getparfloat("f2num",&f2num); n2tic = 1; getparint("n2tic",&n2tic); getparstring("grid2",&grid2s); if (STREQ("dot",grid2s)) grid2 = DOT; else if (STREQ("dash",grid2s)) grid2 = DASH; else if (STREQ("solid",grid2s)) grid2 = SOLID; else grid2 = NONE; getparstring("label2",&label2); getparstring("labelfont",&labelfont); labelsize = 18.0; getparfloat("labelsize",&labelsize); if(!getparstring("title",&ttl)) { ttl = (char*) malloc(30*sizeof(char)); strcpy(ttl,"Velocity Picking "); } sprintf(title,"%s at position = %5d \0",ttl,ppos); getparstring("titlefont",&titlefont); titlesize = 24.0; getparfloat("titlesize",&titlesize); getparstring("style",&styles); if (STREQ("normal",styles)) style = NORMAL; else style = SEISMIC; getparstring("titlecolor",&titlecolor); getparstring("labelcolor",&labelcolor); getparstring("gridcolor",&gridcolor); getparstring("vpickcolor",&vpickcolor); getparstring("vrefcolor",&vrefcolor); getparstring("vpcrdcolor",&vpcrdcolor); if(!getparint("ivmode",&ivmode)) ivmode=0; /* determine previous pick position*/ if(!getparint("cdppre",&cdppre)) cdppre=ppos; if(cdppre==0) cdppre = ppos; icdppre = 0; for(ii=0;ii<ncdpscrd;ii++) { if( cdpscrd[ii] == cdppre ) { icdppre = ii + 1; break; } } if(icdppre == 0 && ncdpscrd>0 ) { icdppre = 0; jj = abs( cdppre - cdpscrd[0] ); for(ii=1;ii<ncdpscrd;ii++) { if( jj>abs(cdppre-cdpscrd[ii]) ) { jj = abs(cdppre-cdpscrd[ii]); icdppre = ii; } } icdppre = icdppre + 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -