// 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); } } } }
//------------------------------------------------------------------------ // // 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); } }