Пример #1
0
// TrackContour() - compute and track a contour by table lookup and propagation
//                  through adjacent cells
//            isovalue  = surface value of interest
//            nextslice = queue of seeds for next slice (used only if tracking in 2d)
void Conplot2d::TrackContour(float isovalue, int cell)
{
	float val[3];
	u_int* verts;
	u_int v1, v2;
	int code;
	int adj;
	int e;
	int nvert = 0, nedge = 0; // to save isocontour components
	queue.Add(cell);
	curslc = (Dataslc*)data->getData(curtime);
	curcon = &con2[curtime];
	if(filePrefix)			// keep track of current nvert, nedge
	{
		nvert = curcon->getNVert();
		nedge = curcon->getNEdge();
	}
	while(queue.Get(cell) > 0)
	{
		curslc->getCellValues(cell, val);
		verts = curslc->getCellVerts(cell);
		code = 0;
		if(val[0] < isovalue)
		{
			code += 0x01;
		}
		if(val[1] < isovalue)
		{
			code += 0x02;
		}
		if(val[2] < isovalue)
		{
			code += 0x04;
		}
		for(e=0; e<unst2d[code][0]; e++)
		{
			v1 = InterpEdge(unst2d[code][2*e+1], val, verts, isovalue, cell);
			v2 = InterpEdge(unst2d[code][2*e+2], val, verts, isovalue, cell);
			curcon->AddEdge(v1, v2);
			adj = curslc->getCellAdj(cell, unst2d[code][2*e+1]);
			if(adj != -1 && !CellTouched(adj))
			{
				TouchCell(adj);
				queue.Add(adj);
			}
			adj = curslc->getCellAdj(cell, unst2d[code][2*e+2]);
			if(adj != -1 && !CellTouched(adj))
			{
				TouchCell(adj);
				queue.Add(adj);
			}
		}
		EnqueueFaces(code, cell, queue);
	}
	if(filePrefix)	// write this isocontour component
	{
		if(curcon->getNEdge() - nedge > 25) // more than 25 edges
		{
			FILE*	fp;
			int		v, e;
			char	filename[200];
			sprintf(filename, "%s%04d.ipoly", filePrefix, ncomponents);
			if((fp = fopen(filename, "w")))
			{
				fprintf(fp, "%d %d 0 0 0 0 0\n0 0 0\n",
						curcon->getNVert() - nvert, curcon->getNEdge() - nedge);
				for(v = nvert; v < curcon->getNVert(); v++)
					fprintf(fp, "%g %g %g\n", curcon->vert[v][0],
							curcon->vert[v][1], 0.0);
				fprintf(fp, "0 0\n");
				for(e = nedge; e < curcon->getNEdge(); e++)
					fprintf(fp, "%d %d\n", curcon->edge[e][0],
							curcon->edge[e][1]);
				fclose(fp);
				ncomponents++;
			}
			else
			{
				char	str[256];
				sprintf(str, "Conplot2d::TrackContour: couldn't open file: %s",
						filename);
				errorHandler(str, false);
			}
		}
	}
}
Пример #2
0
//------------------------------------------------------------------------
//
// TrackContour() - compute and track a contour by table lookup and propagation
//                  through adjacent cells
//            isovalue  = surface value of interest
//            i,j,k     = index of seed cell
//            nextslice = queue of seeds for next slice (used only if tracking in 2d)
//
//------------------------------------------------------------------------
void
Conplotreg3::TrackContour(float isovalue, int cell)
{
    int edge_v[12];
    float val[8];
    float val2[8];
    float grad[3][8];
    u_int v1, v2, v3;
    int i, j, k;
    int e, t;
    int code;
    int edge;

    queue.Add(cell);

    curreg3 = (Datareg3*)data->getData(curtime);
    curcon  = &con3[curtime];

    if (curreg3->getColorFun() != -1)
	curcon->minmaxFun(data->getMinFun(curreg3->getColorFun()),
			  data->getMaxFun(curreg3->getColorFun()));

    while (queue.Get(cell) > 0)
	{
					// select contour for contour function

	// printf("track contour at cell:%d\n", cell);
	// by fan        curreg3->getCellValues(cell, val /*,0*/);
	// Emilio:	 curreg3->getCellValues(cell, val, funcontour);

	curreg3->getCellValues(cell, val, curreg3->getContourFun());

					// use color of color function

	if (curreg3->getColorFun() != -1)
	//if (curreg3->getNData() > 1)
	    // by fan   curreg3->getCellValues(cell, val2, 1);
	    // Emilio:	curreg3->getCellValues(cell, val2, funcolor);
	    curreg3->getCellValues(cell, val2, curreg3->getColorFun());

	curreg3->getCellGrad(cell, grad);
	curreg3->cell2index(cell, i, j, k);

	code = 0;
	if (val[0] < isovalue) code |= 0x01;
	if (val[1] < isovalue) code |= 0x02;
	if (val[2] < isovalue) code |= 0x04;
	if (val[3] < isovalue) code |= 0x08;
	if (val[4] < isovalue) code |= 0x10;
	if (val[5] < isovalue) code |= 0x20;
	if (val[6] < isovalue) code |= 0x40;
	if (val[7] < isovalue) code |= 0x80;

	for (e = 0; e < cubeedges[code][0]; e++)
	    {
	    edge = cubeedges[code][1+e];
            edge_v[edge] = InterpEdge(val, val2, grad, isovalue, i, j, k, edge);
	    }

        for (t=0; triCases[code].edges[t] != -1; )
	    {
            v1 = edge_v[triCases[code].edges[t++]];
            v2 = edge_v[triCases[code].edges[t++]];
            v3 = edge_v[triCases[code].edges[t++]];
            curcon->AddTri(v1, v2, v3);
	    }

        EnqueueFaces(code, i, j, k, queue);
	}
}