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

📄 region.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
int min, max, seed1, seed2, seed3, neighborhood;	{	int stride1, stride2, stride3, count=0;	Shadow endold;	register Shadow old, new, listend;	register int cell1;	register Buffer cell;	int neighbor[26], *face1, *edge1, *corner1;	register int *nbr, *face2, *edge2, *corner2;	/* precondition data boundaries */	region->size = 0;	RegionClear ();	region->size = 0;	RegionMarkBorder (data,size1,size2,size3);/*	seed1 = seed1 > 0 ? seed1 : 1;	seed2 = seed2 > 0 ? seed2 : 1;	seed3 = seed3 > 0 ? seed3 : 1;	seed1 = seed1 <= size1 ? seed1 : size1 - 2;	seed2 = seed2 <= size2 ? seed2 : size2 - 2;	seed3 = seed3 <= size3 ? seed3 : size3 - 2;*/	/* enummerate the neighbor offsets */	nbr = neighbor;	/* face neighbors (single stride combinations) */	stride1 = 1;	stride2 = size1;	stride3 = size1 * size2;	face1 = nbr;	*nbr++ = stride1;	*nbr++ = stride2;	*nbr++ = stride3;	*nbr++ = -stride1;	*nbr++ = -stride2;	*nbr++ = -stride3;	face2 = nbr;	/* edge neighbors (two stride combinations) */	edge1 = nbr;	*nbr++ = stride1 + stride2;	*nbr++ = stride1 - stride2;	*nbr++ = -stride1 + stride2;	*nbr++ = -stride1 - stride2;	*nbr++ = stride2 + stride3;	*nbr++ = stride2 - stride3;	*nbr++ = -stride2 + stride3;	*nbr++ = -stride2 - stride3;	*nbr++ = stride3 + stride1;	*nbr++ = stride3 - stride1;	*nbr++ = -stride3 + stride1;	*nbr++ = -stride3 - stride1;	edge2 = nbr;	/* corner neighbors (three stride combinations) */	corner1 = nbr;	*nbr++ = stride3 + stride2 + stride1;	*nbr++ = stride3 + stride2 - stride1;	*nbr++ = stride3 - stride2 + stride1;	*nbr++ = stride3 - stride2 - stride1;	*nbr++ = -stride3 + stride2 + stride1;	*nbr++ = -stride3 + stride2 - stride1;	*nbr++ = -stride3 - stride2 + stride1;	*nbr++ = -stride3 - stride2 - stride1;	corner2 = nbr;	cell = data;	old = list;	endold = list + 1;	new = list + 1;	listend = list + nlist;	list[0] = seed1 * stride1 + seed2 * stride2 + seed3 * stride3;	UNMARK(cell[list[0]]);/*	printf ("list[0]=%d min=%d max=%d value=%d\n",list[0],min,max,cell[list[0]]);*/	while (old<new && new<listend) {/*		printf ("old=%d endold=%d new=%d\n",old-list,endold-list,new-list);*/		/* make room in list by slide new entries over old */		for (endold=new, new=old, old=list; new<endold;) *old++ = *new++;		count += old-list;		for (new=old, endold=old, old=list; old<endold && new<listend; old++) {			/* examine face cells */			if (neighborhood & MARK_FACE) {				for (nbr=face1; nbr<face2 && new<listend; nbr++) {					*new = *old + *nbr;					cell1 = cell[*new];					if (INRANGE(cell1)) {						MARK(cell[*new++]);						}					}				}			/* examine edge cells */			if (neighborhood & MARK_EDGE) {				for (nbr=edge1; nbr<edge2 && new<listend; nbr++) {					*new = *old + *nbr;					cell1 = cell[*new];					if (INRANGE(cell1)) {						MARK(cell[*new++]);						}					}				}			/* examine corner cells */			if (neighborhood & MARK_CORNER) {				for (nbr=corner1; nbr<corner2 && new<listend; nbr++) {					*new = *old + *nbr;					cell1 = cell[*new];					if (INRANGE(cell1)) {						MARK(cell[*new++]);						}					}				}			}		}	/* unmark boundaries */	RegionUnMarkBorder (data,size1,size2,size3,min,max);	/* return list size */	return (count);	}/* mark the borders of the data cube */RegionMarkBorder (data,size1,size2,size3)Buffer data;int size1, size2, size3;	{	Buffer d3, d2, e2;	register Buffer d1, e1;	int stride1, stride2, stride3, sz3, sz2, sz1, strd3, strd2;	register int strd1;	stride1 = 1;	stride2 = size1;	stride3 = size1 * size2;	/* n3 edges */	sz3 = size3;	sz2 = size2;	sz1 = size1;	strd3 = stride3;	strd2 = stride2;	strd1 = stride1;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	/* n2 edges */	sz3 = size2;	sz2 = size1;	sz1 = size3;	strd3 = stride2;	strd2 = stride1;	strd1 = stride3;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	/* n1 edges */	sz3 = size1;	sz2 = size3;	sz1 = size2;	strd3 = stride1;	strd2 = stride3;	strd1 = stride2;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		MARK (*d1);	}/* unmark border of voxel cube */RegionUnMarkBorder (data,size1,size2,size3,Min,Max)Buffer data;int size1, size2, size3, Min, Max;	{	Buffer d3, d2, e2;	register Buffer d1, e1;	int stride1, stride2, stride3, sz3, sz2, sz1, strd2;	register int strd1, strd3, min, max;	stride1 = 1;	stride2 = size1;	stride3 = size1 * size2;	min = Min;	max = Max;	/* n3 edges */	sz3 = size3;	sz2 = size2;	sz1 = size1;	strd3 = stride3;	strd2 = stride2;	strd1 = stride1;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1+strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1-strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	/* n2 edges */	sz3 = size2;	sz2 = size1;	sz1 = size3;	strd3 = stride2;	strd2 = stride1;	strd1 = stride3;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1+strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1-strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	/* n1 edges */	sz3 = size1;	sz2 = size3;	sz1 = size2;	strd3 = stride1;	strd2 = stride3;	strd1 = stride2;	d3 = data;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1+strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	d3 = data + (sz3-1)*strd3;	for (d2=d3, e2=d2+sz2*strd2; d2<e2; d2+=strd2)	for (d1=d2, e1=d1+sz1*strd1; d1<e1; d1+=strd1)		{if (NOTMARK(*(d1-strd3)) || OUTRANGE(*d1)) UNMARK(*d1);}	}/* write region coordinates and values to a file */RegionDump ()	{	extern REgion region;	extern Data data;	string filename;	FILE *fd;	int n1, n2, n3, i1, i2, i3, i, ii=1, value;	float *values0, *values1, *values2, *values3;	register Buffer save;	register Buffer buf, datap, edata;	if (region->size <= 0) return;	n1 = AxisSize(DataAxis(data,DATA_AXIS1));	n2 = AxisSize(DataAxis(data,DATA_AXIS2));	n3 = AxisSize(DataAxis(data,DATA_AXIS3));	values0 = AxisValues(DataAxis(data,DATA_VALUE));	values1 = AxisValues(DataAxis(data,DATA_AXIS1));	values2 = AxisValues(DataAxis(data,DATA_AXIS2));	values3 = AxisValues(DataAxis(data,DATA_AXIS3));	sprintf (filename,"region.list.%d.txt",region->size);	fd = fopen (filename,"w");	fprintf (fd,"%5s %5s %5s %5s %5s %10s %10s %10s %10s\n","i","i3","i2","i1","i0","v3","v2","v1","v0");	fprintf (fd,"%5d %5d %5d %5d %5d %10g %10g %10g %10g\n",0,0,0,0,region->bound[0],values3[0],values2[0],values1[0],values0[region->bound[0]]);	fprintf (fd,"%5d %5d %5d %5d %5d %10g %10g %10g %10g\n",region->size,n3,n2,n1,region->bound[1],values3[n3-1],values2[n2-1],values1[n1-1],values0[region->bound[1]]);	buf = DataBuffer(data);	for (datap=buf, edata=datap+DataSize(data); datap<edata; datap++) {		if (ISMARK(*datap)) {			i = datap - buf;			i1 = i % n1;			i = i / n1;			i2 = i % n2;			i3 = i / n2;			fprintf (fd,"%5d %5d %5d %5d %5d %10g %10g %10g %10g\n",ii++,i3,i2,i1,(*datap) & 0x7f,values3[i3],values2[i2],values1[i1],values0[(*datap) & 0x7f]);			}		}	fclose (fd);	UIMessage ("region dumped to file");	}/* test#define N 16unsigned char x[16][16][16];#define	NLIST	1024int list[NLIST];main () {	int i, j, k;	for (i=4; i<12; i++)	for (j=4; j<12; j++)	for (k=4; k<12; k++)		x[i][j][k] = 8;	i = RegionMark (x,N,N,N,6,9,2180,MARK_FACE|MARK_CORNER,list,NLIST);	printf ("nlist=%d\n",i);	write (creat("tmp",0644),x,N*N*N);	}*/

⌨️ 快捷键说明

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