⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iipick.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 5 页
字号:
	sprintf(string,"(%0.4g,%0.4g)",x1,x2);	XTextExtents(fs,string,strlen(string),&dummy,&dummy,&dummy,&overall);	XDrawImageString(dpy,win,gc,xoffset,yoffset+overall.ascent,		string,strlen(string));}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,	float *x1picks, float *x2picks, float *veltop, float *velbot, int *dif,	float *velavg, float *dvdz,	int *npicks, int nhs, int ism, 	float xmin, float xmax, float zmin, float zmax,	int cdpxmin, int cdpxmax, float dcdp, 	int *hnums, char hnames[maxhs][80],	char *dunits, char *zattrib, int idif, int ihfile) {	int ic,ip,np,ih,jp,nhout,h0; 	int p1,p2,i,ismx,ismxh, izt;	float vmax, vmin, s;	float *w, *f;	float vt, vb, g;	/* lateral smooth velocities */	if(ism==0) {	/* take average */ 		for(ih=0;ih<nhs;ih++) {			vt = 0.;			vb = 0.;			g = 0.;			np = npicks[ih];			for(ip=0;ip<np;ip++) {				vt += veltop[ip+ih*maxpks];				vb += velbot[ip+ih*maxpks];				g += dvdz[ip+ih*maxpks];			}			if(np>0) {				vt = vt/np;				vb = vb/np;				g = g/np;			}			for(ip=0;ip<np;ip++) {				veltop[ip+ih*maxpks] = vt;				velbot[ip+ih*maxpks] = vb;				dvdz[ip+ih*maxpks] = g;			}		}	} else if (ism>1) {	/* smoothing */		for(ih=0;ih<nhs;ih++) {			h0 = ih * maxpks;			np = npicks[ih];			if(np<2) continue;			ismx = ism;			ismx = (ismx/2)*2+1;			if(ismx>np) ismx=(np/2)*2+1;			f = (float *) malloc(ismx*sizeof(float));			w = (float *) malloc(np*sizeof(float));			/* triangular smoothing coefficients */			ismxh = (ismx+1)/2;			s = 0.;			for(i=0;i<ismx;i++) {				f[i] = ismxh - abs(i+1-ismxh);				s += f[i];			}			s = 1./s;			for(i=0;i<ismx;i++) {				f[i]=f[i]*s;			}			/* apply smoothing to veltop, velbot and dvdz */			ic = 1;			smth1d_(veltop+h0,f,w,&np,&ismx,&ic);			for(ip=0;ip<np;ip++) veltop[ip+h0] = w[ip];			smth1d_(velbot+h0,f,w,&np,&ismx,&ic);			for(ip=0;ip<np;ip++) velbot[ip+h0] = w[ip];			smth1d_(dvdz+h0,f,w,&np,&ismx,&ic);			for(ip=0;ip<np;ip++) dvdz[ip+h0] = w[ip];			free(w);			free(f);		}	}	/* find maximum and minimum velocities */	vmin = veltop[0];	vmax = veltop[0];	for (ih=0;ih<nhs;ih++) {		for(ip=0;ip<npicks[ih];ip++) {			jp = ip + ih * maxpks;			if(vmin>veltop[jp]) vmin = veltop[jp];			if(vmin>velbot[jp]) vmin = velbot[jp];			if(vmax<veltop[jp]) vmax = veltop[jp];			if(vmax<velbot[jp]) vmax = velbot[jp];		}	}	nhout = 0;	for(ih=0;ih<nhs;ih++) {		if(npicks[ih]>1) nhout = nhout + 1;	}	/* output picks */	if(ihfile==0) {		fprintf(mpicksfp, 		"IFILE   <--- FILE FORMAT DESCRIPTOR (INTERFACE FILE) \n");	} else {		fprintf(mpicksfp, "HFILE  \n");	}	fprintf(mpicksfp,"\n");	fprintf(mpicksfp, "MODEL.X-MIN         %8.1f\n",xmin);	fprintf(mpicksfp, "MODEL.X-MAX         %8.1f\n",xmax);	fprintf(mpicksfp, "MODEL.Z-MIN         %8.1f \n",zmin);	fprintf(mpicksfp, "MODEL.Z-MAX         %8.1f \n",zmax);	fprintf(mpicksfp, "MODEL.CDP#-AT-X-MIN %6d\n",cdpxmin);	fprintf(mpicksfp, "MODEL.CDP#-AT-X-MAX %6d\n",cdpxmax);	fprintf(mpicksfp, "MODEL.MIN-VELOCITY  %8.1f\n",vmin); 	fprintf(mpicksfp, "MODEL.MAX-VELOCITY  %8.1f\n",vmax); 	fprintf(mpicksfp, "MODEL.#HORIZONS     %6d\n",nhout); 	fprintf(mpicksfp, "MODEL.VELOCITY-TYPE  INTERVAL\n"); 	fprintf(mpicksfp, "MODEL.DIST-UNITS     %s\n",dunits); 	fprintf(mpicksfp, "MODEL.Z-ATTRIBUTE    %s\n",zattrib); 	fprintf(mpicksfp, "MODEL.CDP-SPACING   %8.1f\n",dcdp); 	fprintf(mpicksfp, "\n"); 	if( zattrib=="DEPTH SECTION" ) {		izt = 1; 	} else {		izt = 0; 	}		for(ih=0;ih<nhs;ih++) {		np = npicks[ih];		if(np<=1) continue;		fprintf(mpicksfp, "\n"); 		fprintf(mpicksfp, "\n"); 		fprintf(mpicksfp, "HORIZON-NUMBER %3d\n", hnums[ih]); 		fprintf(mpicksfp, "HORIZON-NAME     %s\n", hnames[ih]); 		fprintf(mpicksfp, "* \n"); 		fprintf(mpicksfp, "* X-VALUE   Z-VALUE   VELTOP   VELBOT  DIF  DENS  QVAL  POIS   VELAVG   DVDZ \n");		fprintf(mpicksfp, "* =======  ========  =======  =======  ===  ====  ====  ====  =======  ======= \n");		h0 = ih*maxpks;		for(ip=1;ip<np-1;ip++) dif[h0+ip]=idif;		dif[h0] = 1;		dif[h0+np-1] = 1;				for (ip=0;ip<npicks[ih];ip++) {			if(izt==1) {   			fprintf(mpicksfp, "%9.1f %9.1f %8.0f %8.0f   %1d   0.00    0.  .000 %8.0f %8.0f \n",				x2picks[ip+h0],x1picks[ip+h0],				veltop[ip+h0],velbot[ip+h0],dif[ip+h0],				velavg[ip+h0],dvdz[ip+h0]);			} else {   			fprintf(mpicksfp, "%9.1f %9.3f %8.0f %8.0f   %1d   0.00    0.  .000 %8.0f %8.0f \n",				x2picks[ip+h0],x1picks[ip+h0],				veltop[ip+h0],velbot[ip+h0],dif[ip+h0],				velavg[ip+h0],dvdz[ip+h0]);			}		}	}	fflush(mpicksfp);}void xMousePicks(Display *dpy, Window win, XEvent event, int style,	char hcolors[maxhs][10],	FILE *mpicksfp, int x, int y, int width, int height,	float x1begb, float x1endb, float x2begb, float x2endb,	float *x1picks, float *x2picks, float *veltop, float *velbot, int *dif,	int *npicks, int nhs, int ih, GC gc, int pkey, int *savebg){	float x1,x2;	int ipicks;	int xx1,yy1,xx2,yy2,temp,ip,jp;	int dismin,dis;	int ipmin, ipins, offset, jh, itmp;	char hnum[3];	GC gchi;        XGCValues *values;        XColor scolor,ecolor;        XWindowAttributes wa;        Colormap cmap;        int scr;	/* save bitmap of window to background for retrival */ 	if(*savebg) {		fg2bg(dpy,win);		*savebg = 0;	}	/* convert mouse location to (x1,x2) coordinates */	if (style==NORMAL) {		x1 = x1begb+(x1endb-x1begb)*(event.xmotion.x-x)/width;		x2 = x2endb+(x2begb-x2endb)*(event.xmotion.y-y)/height;	} else {		x1 = x1begb+(x1endb-x1begb)*(event.xmotion.y-y)/height;		x2 = x2begb+(x2endb-x2begb)*(event.xmotion.x-x)/width;	}	offset = (ih-1)*maxpks;	jh = ih - 1;	/* save to x1picks and x2picks */	ipicks = npicks[jh];	if( pkey == 0 ) {		jp = ipicks + offset;		x1picks[jp] = x1;		x2picks[jp] = x2;		npicks[jh] += 1;	/* delete nearest picks from x1picks and x2picks*/	} else if ( pkey==1 && ipicks > 0 ) {		dismin=(x1-x1picks[offset])*(x1-x1picks[offset])+		       (x2-x2picks[offset])*(x2-x2picks[offset]);		ipmin = 0;		for(ip=1;ip<ipicks;ip++) {			jp = ip + offset;		   	dis=(x1-x1picks[jp])*(x1-x1picks[jp])+		       		(x2-x2picks[jp])*(x2-x2picks[jp]);			if(dis<dismin) {				dismin = dis;				ipmin = ip;			}		}		ipicks = ipicks - 1;		for(ip=ipmin;ip<ipicks;ip++) {			jp = ip + offset;			x1picks[jp] = x1picks[jp+1];			x2picks[jp] = x2picks[jp+1];		}		npicks[jh] = ipicks;	/* insert the pick */	} else if ( pkey==2 ) {		dismin=(x2-x2picks[offset])*(x2-x2picks[offset]);		ipmin = 0;		for(ip=1;ip<ipicks;ip++) {			jp = ip + offset;			dis=(x2-x2picks[jp])*(x2-x2picks[jp]);			if(dis<dismin) {				dismin = dis;				ipmin = ip;			}		}		if(x2>x2picks[ipmin+offset]) { 			ipins = ipmin+1;			ipicks +=1;			for(ip=ipicks;ip>ipins;ip--) {				jp = ip+offset;				x1picks[jp] = x1picks[jp-1];				x2picks[jp] = x2picks[jp-1];			}			x1picks[ipins+offset] = x1;			x2picks[ipins+offset] = x2;		} else if(x2<x2picks[ipmin+offset]) {			ipins = ipmin;			ipicks +=1;			for(ip=ipicks;ip>ipins;ip--) {				jp = ip + offset;				x1picks[jp] = x1picks[jp-1];				x2picks[jp] = x2picks[jp-1];			}			x1picks[ipins+offset] = x1;			x2picks[ipins+offset] = x2;		}		npicks[jh] = ipicks;	}	if ( pkey==5 ) {		for(ip=0;ip<npicks[jh];ip++) {			jp = ip + offset;			x1picks[jp] = 0.;			x2picks[jp] = 0.;		}		npicks[jh] = 0;		ipicks = 0;	}       	XClearWindow(dpy, win);	/* draw lines between picks */	for(jh=0;jh<nhs;jh++) {			/* get screen */                scr = DefaultScreen(dpy);                /* determine window's current colormap */                XGetWindowAttributes(dpy,win,&wa);                cmap = wa.colormap;		/* create graphics contexts */                gchi = XCreateGC(dpy,win,0,values);                if (XAllocNamedColor(dpy,cmap,hcolors[jh],&scolor,&ecolor))                        XSetForeground(dpy,gchi,ecolor.pixel);                else                        XSetForeground(dpy,gchi,1L);                XSetLineAttributes(dpy,gchi,2,LineSolid,CapButt,JoinMiter);		ipicks = npicks[jh];		offset = jh*maxpks;		itmp = ipicks / 5;		if(itmp<2) itmp=ipicks/2;		if(ipicks>1) {			for(ip=1;ip<ipicks;ip++) {				jp = ip + offset;				/*				if(x1picks[jp-1]<x1begb ||				   x1picks[jp-1]>x1endb ||				   x1picks[jp]<x1begb ||				   x1picks[jp]>x1endb ||				   x2picks[jp-1]<x2begb ||				   x2picks[jp-1]>x2endb ||				   x2picks[jp]<x2begb ||				   x2picks[jp]>x2endb) continue;				*/				if (style==NORMAL) {			xx1=(x1picks[jp-1]-x1begb)/(x1endb-x1begb)*width+x;			yy1=(x2picks[jp-1]-x2endb)/(x2begb-x2endb)*height+y;			xx2=(x1picks[jp]-x1begb)/(x1endb-x1begb)*width+x;			yy2=(x2picks[jp]-x2endb)/(x2begb-x2endb)*height+y;				} else {			yy1=(x1picks[jp-1]-x1begb)/(x1endb-x1begb)*height+y;			xx1=(x2picks[jp-1]-x2begb)/(x2endb-x2begb)*width+x;			yy2=(x1picks[jp]-x1begb)/(x1endb-x1begb)*height+y;			xx2=(x2picks[jp]-x2begb)/(x2endb-x2begb)*width+x;				}				XDrawLine(dpy,win,gchi,xx1,yy1,xx2,yy2);				if(ip==1) {					XDrawLine(dpy,win,gchi,						xx1-4,yy1,xx1+4,yy1);					XDrawLine(dpy,win,gchi,						xx1,yy1-4,xx1,yy1+4);				}				XDrawLine(dpy,win,gchi,xx2-4,yy2,xx2+8,yy2);				XDrawLine(dpy,win,gchi,xx2,yy2-4,xx2,yy2+4);				if( (ip%itmp)==0 ) {					sprintf(hnum,"%-3d",jh+1);					XDrawString(dpy,win,gchi,                        		xx2,yy2,hnum,strlen(hnum));				} 			}			sprintf(hnum,"%-3d",jh+1);			XDrawString(dpy,win,gchi,                        xx2,yy2,hnum,strlen(hnum));						XFreeGC(dpy,gchi);		}	}}/* compute velocities from VELO and DVDZ cards */void vtopbot(int maxp,int maxcdp,      int ncdp_velo,float *x_velo,float *z_velo,float *v_velo,int *nps_velo,     int ncdp_dvdz,float *x_dvdz,float *zt_dvdz,float *zb_dvdz,      float *dvdz_dvdz, int *nps_dvdz,     int nhs,float *xpicks,float *zpicks,int *npicks,float xtol,      float *veltops,float *velbots,float *velavgs,float *dvdzs,int lhnvelo) {	float x, z, va, g, vat, gt, vab, gb;	int ih, ip, jh;	float zmax, xmin, xmax, zt, zb, tmp;	float *vth, *vbh, *vah, *dvdzh, *xvh, *zvs, *zvh;	float *zgrid, *vagrid, *dvdzgrid, dz, *g1, *g2, *z2, z21, z2n;	/* float *vt2, *vb2, *va2, *dvdz2; */	int i1,i2,n1,n2,one,nzgrid;	int *ivs, *nvh;	int iz, n, j2, j1, nvs;	float *xnew, *znew, *vanew, *vtnew, *vbnew, *gnew, xpre, xnow;	int *indx, inow;	float *zsort;	int *isort;	FILE *tty;        char vtopyes,vbotyes;			if(ncdp_velo==0) {		/* if no velo card input, simply return with warning message */		warn("no VELO card input, ifile editing may be needed ! \n");	} else {		/* find maximum depth */		zmax = 0.;		for(ih=0;ih<nhs;ih++) {			for(iz=0;iz<npicks[ih];iz++) {				if(zmax<zpicks[ih*maxpks+iz])				  	zmax=zpicks[ih*maxpks+iz];			}		}		for(i2=0;i2<ncdp_velo;i2++) {			for(iz=0;iz<nps_velo[i2];iz++) {				if(zmax<z_velo[i2*maxp+iz])				  	zmax=z_velo[i2*maxp+iz];			}		}		nzgrid = 1024;		zgrid = (float *) malloc(nzgrid*sizeof(float));		vagrid = (float *) malloc(nzgrid*ncdp_velo*sizeof(float));		dvdzgrid = (float *) malloc(nzgrid*ncdp_velo*sizeof(float));		g1 = (float *) malloc(nzgrid*sizeof(float));		g2 = (float *) malloc(nzgrid*sizeof(float));		vth = (float *) malloc(nhs*ncdp_velo*sizeof(float));		vbh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		vah = (float *) malloc(nhs*ncdp_velo*sizeof(float));		dvdzh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		xvh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		zvh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		nvh = (int *) malloc(nhs*sizeof(int));		zvs = (float *) malloc(nhs*sizeof(float));		ivs = (int *) malloc(nhs*sizeof(int));		zsort = (float *) malloc(nhs*sizeof(float));		isort = (int *) malloc(nhs*sizeof(int));		vtnew = (float *) malloc(maxpks*sizeof(float));		vbnew = (float *) malloc(maxpks*sizeof(float));		indx = (int *) malloc(maxpks*sizeof(int));		vanew = (float *) malloc(maxpks*sizeof(float));		gnew = (float *) malloc(maxpks*sizeof(float));		xnew = (float *) malloc(maxpks*sizeof(float));		znew = (float *) malloc(maxpks*sizeof(float));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -