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

📄 region.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
/*Identifies and processes continginous region between bounds starting at a seed.There are three definitions of continginous: 6 faces +- 12 edges +- 8 corners.The eighth bit of the data bytes stores the region mark.*/#include <stdio.h>#include "main.h"#include "axis.h"#include "data.h"#include "render.h"#include "region.h"REgion region;/* initialize region object */RegionInit ()	{	extern Data data;	extern REgion region;	int n1, n2, n3, iaxis;	NEW (REgion,region,1);	region->live = 1;	region->neighborhood = MARK_FACE | MARK_EDGE | MARK_CORNER;	region->bound[0] = 0;	region->bound[1] = 0;	for (iaxis=DATA_AXIS0; iaxis<=DATA_AXIS3; iaxis++) region->seed[iaxis] = NO_INDEX;	n1 = AxisSize (DataAxis(data,DATA_AXIS0));	n2 = AxisSize (DataAxis(data,DATA_AXIS1));	n3 = AxisSize (DataAxis(data,DATA_AXIS2));	region->nlist = 4 * (n1 * n2 + n2 * n3 + n3 * n1);	NEW (Shadow,region->list,region->nlist);	region->size = 0;	region->save = 0;	region->index = 0;	}/* turn on region picking callback */RegionSetLive (live)int live;	{	extern REgion region;	if (!region) return;	region->live = live;	}/* set bound */RegionSetBound (index,ibound)int index, ibound;	{	extern REgion region;	if (!region) return;	if (ibound < 0 || ibound > 1) return;	region->bound[ibound] = index;	}/* set region neighborhood mode callback */RegionSetNeighborhood (mode)int mode;	{	extern REgion region;		if (!region) return;	if (region->neighborhood != mode) {		region->neighborhood = mode;		RegionMark0 ();		}	}/* set region seed callback */RegionSetSeed (seed)int seed[4];	{	int iaxis;	extern REgion region;	extern Data data;	if (!region) return;	if (!region->live) return;	for (iaxis=DATA_AXIS0; iaxis<=DATA_AXIS3; iaxis++) region->seed[iaxis] = seed[iaxis];	UNMARK(region->seed[DATA_VALUE]);	}/* return bound */RegionBound (ibound)int ibound;	{	if (!region) return (NO_INDEX);	if (ibound < 0 || ibound > 1) return (NO_INDEX);	return (region->bound[ibound]);	}/* return region size */RegionSize ()	{	if (!region) return (NO_INDEX);	return (region->size);	}/* mark a region callback */RegionMark0 ()	{	extern REgion region;	extern Data data;	Message message;	if (!region) return;	if (!region->live) return;	if (region->seed[DATA_AXIS1] == NO_INDEX) return;	region->size = RegionMark (DataBuffer(data),		AxisSize(DataAxis(data,DATA_AXIS1)),		AxisSize(DataAxis(data,DATA_AXIS2)),		AxisSize(DataAxis(data,DATA_AXIS3)),		region->seed[DATA_AXIS1],		region->seed[DATA_AXIS2],		region->seed[DATA_AXIS3],		region->bound[0]<region->bound[1]?region->bound[0]:region->bound[1],		region->bound[0]>region->bound[1]?region->bound[0]:region->bound[1],		region->neighborhood,		region->list,		region->nlist);	if (region->size) ViewDrawAll();	sprintf (message,"Region: min=%g max=%g size=%d",		DataValue (data,region->bound[0]),		DataValue (data,region->bound[1]),		region->size);	UIMessage (message);	}/* fill a region with a value callback */RegionFill (seed,bound1,bound2,value)int seed[4], bound1, bound2, value;	{	int iaxis;	extern REgion region;	extern Data data;	Message message;	if (!region) return;	for (iaxis=DATA_AXIS0; iaxis<=DATA_AXIS3; iaxis++) region->seed[iaxis] = seed[iaxis];	region->bound[0] = bound1;	region->bound[1] = bound2;	region->size = RegionMark (DataBuffer(data),		AxisSize(DataAxis(data,DATA_AXIS1)),		AxisSize(DataAxis(data,DATA_AXIS2)),		AxisSize(DataAxis(data,DATA_AXIS3)),		region->seed[DATA_AXIS1],		region->seed[DATA_AXIS2],		region->seed[DATA_AXIS3],		region->bound[0],		region->bound[1],		region->neighborhood,		region->list,		region->nlist);	if (region->size) {		RegionSetValue (value,value);		RegionClear ();		}	sprintf (message,"Region: min=%g max=%g size=%d",		DataValue (data,region->bound[0]),		DataValue (data,region->bound[1]),		region->size);	UIMessage (message);	}/* clear region marks in data */RegionClear ()	{	extern Data data;	register Buffer datap, edata;	if (!region || !data) return;	for (datap=DataBuffer(data), edata=datap+DataSize(data); datap<edata;) {		UNMARK (*datap++);		}	if (region->size > 0) {		ViewDrawAll ();		}	}/* set all marked cells to value */RegionSetValue (bound1,bound2)int bound1, bound2;	{	extern Data data;	unsigned char _table[256];	register Buffer datap, edata, savep, buf, table;	register Shadow indexp;	int ibound;	if (!region || !data) return;	if (bound1 == NO_INDEX) return;	/* initialize table */	if (region->bound[0] < region->bound[1]) {		for (ibound=region->bound[0]; ibound<=region->bound[1]; ibound++) {			_table[ibound] = bound1 + (ibound*(bound2-bound1))/(region->bound[1]-region->bound[0]);			}		}	else if (region->bound[0] > region->bound[1]) {		for (ibound=region->bound[1]; ibound<=region->bound[0]; ibound++) {			_table[ibound] = bound1 + (ibound*(bound2-bound1))/(region->bound[1]-region->bound[0]);			}		}	else _table[region->bound[0]] = bound2;	table = _table;	FREE (region->index);	FREE (region->save);	NEW (Shadow,region->index,region->size);	NEW (byte,region->save,region->size);	buf = DataBuffer(data);	indexp = region->index;	savep = region->save;	for (datap=buf, edata=datap+DataSize(data); datap<edata; datap++) {		if (ISMARK(*datap)) {			*indexp++ = datap - buf;			*savep = (*datap) & 0x7F;			*datap = table[*savep++];			}		}	}/* undo last region smoothing */RegionRestoreValue ()	{	extern REgion region;	extern Data data;	register Buffer datap, savep, endp;	register Shadow indexp;	if (!region) return;	if (region->size == 0) {		UIMessage ("no smoothing or can only unsmooth once");		return;		}	indexp = region->index;	datap = DataBuffer (data);	savep = region->save;	endp = savep + region->size;	for (; savep<endp;) {		datap[*indexp++] = *savep++;		}	region->size = 0;	FREE (region->index);	FREE (region->save);	}/* return message about geion callback */RegionInfo ()	{	Message message;	sprintf (message, "Region: live=%d size=%d bound1=%d bound2=%d seed=(%d,%d,%d) value=%d neighborhood=%d nlist=%d",		region->live,		region->size,		region->bound[0],		region->bound[1],		region->seed[DATA_AXIS1],		region->seed[DATA_AXIS2],		region->seed[DATA_AXIS3],		region->seed[DATA_VALUE],		RegionNeighbors(),		region->nlist);	UIMessage (message);	}/* count neighbors */RegionNeighbors ()	{	return (		(region->neighborhood & MARK_FACE)/MARK_FACE * 6 +		(region->neighborhood & MARK_EDGE)/MARK_EDGE * 12 +		(region->neighborhood & MARK_CORNER)/MARK_CORNER * 8		);	}/* save region parameters */RegionSavePar ()	{	Message message;	sprintf (message, "Region: seed=%d,%d,%d value=%d neighborhood=%d",		region->seed[DATA_AXIS1],		region->seed[DATA_AXIS2],		region->seed[DATA_AXIS3],		region->seed[DATA_VALUE],		region->neighborhood);	UISaveMessage (message);	}/* mark contiguous voxels, given seed, min and max;   continginous defined by mode: MARK_FACE=6, MARK_EDGE=12, MARK_CORNER=8   list returned; nlist is maximum size */RegionMark (data,size1,size2,size3,seed1,seed2,seed3,min,max,neighborhood,list,nlist)Buffer data;Shadow list;int nlist;int size1, size2, size3;

⌨️ 快捷键说明

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