📄 slicer.cc
字号:
/**********for reading newtess_flag from a file**********/#ifdef USE_READ_FLAGstatic Int read_flag(char* name){ Int ret; FILE* fp = fopen(name, "r"); if(fp == NULL) { fprintf(stderr, "can't open file %s\n", name); exit(1); } fscanf(fp, "%i", &ret); fclose(fp); return ret;}#endif /***********nextgen tess****************/#include "sampleMonoPoly.h"directedLine* arcToDLine(Arc_ptr arc){ int i; Real vert[2]; directedLine* ret; sampledLine* sline = new sampledLine(arc->pwlArc->npts); for(i=0; i<arc->pwlArc->npts; i++) { vert[0] = arc->pwlArc->pts[i].param[0]; vert[1] = arc->pwlArc->pts[i].param[1]; sline->setPoint(i, vert); } ret = new directedLine(INCREASING, sline); return ret;} /*an pwlArc may not be a straight line*/directedLine* arcToMultDLines(directedLine* original, Arc_ptr arc){ directedLine* ret = original; int is_linear = 0; if(arc->pwlArc->npts == 2 ) is_linear = 1; else if(area(arc->pwlArc->pts[0].param, arc->pwlArc->pts[1].param, arc->pwlArc->pts[arc->pwlArc->npts-1].param) == 0.0) is_linear = 1; if(is_linear) { directedLine *dline = arcToDLine(arc); if(ret == NULL) ret = dline; else ret->insert(dline); return ret; } else /*not linear*/ { for(Int i=0; i<arc->pwlArc->npts-1; i++) { Real vert[2][2]; vert[0][0] = arc->pwlArc->pts[i].param[0]; vert[0][1] = arc->pwlArc->pts[i].param[1]; vert[1][0] = arc->pwlArc->pts[i+1].param[0]; vert[1][1] = arc->pwlArc->pts[i+1].param[1]; sampledLine *sline = new sampledLine(2, vert); directedLine *dline = new directedLine(INCREASING, sline); if(ret == NULL) ret = dline; else ret->insert(dline); } return ret; }} directedLine* arcLoopToDLineLoop(Arc_ptr loop){ directedLine* ret; if(loop == NULL) return NULL; ret = arcToMultDLines(NULL, loop);//ret->printSingle(); for(Arc_ptr temp = loop->next; temp != loop; temp = temp->next){ ret = arcToMultDLines(ret, temp);//ret->printSingle(); } return ret;}/*void Slicer::evalRBArray(rectBlockArray* rbArray, gridWrap* grid){ TrimVertex *trimVert = (TrimVertex*)malloc(sizeof(TrimVertex)); trimVert -> nuid = 0;//???? Real* u_values = grid->get_u_values(); Real* v_values = grid->get_v_values(); Int i,j,k,l; for(l=0; l<rbArray->get_n_elements(); l++) { rectBlock* block = rbArray->get_element(l); for(k=0, i=block->get_upGridLineIndex(); i>block->get_lowGridLineIndex(); i--, k++) { backend.bgnqstrip(); for(j=block->get_leftIndices()[k+1]; j<= block->get_rightIndices()[k+1]; j++) { trimVert->param[0] = u_values[j]; trimVert->param[1] = v_values[i]; backend.tmeshvert(trimVert); trimVert->param[1] = v_values[i-1]; backend.tmeshvert(trimVert); } backend.endqstrip(); } } free(trimVert);}*/void Slicer::evalRBArray(rectBlockArray* rbArray, gridWrap* grid){ Int i,j,k; Int n_vlines=grid->get_n_vlines(); //the reason to switch the position of v_max and v_min is because of the //the orientation problem. glEvalMesh generates quad_strip clockwise, but //we need counter-clockwise. backend.surfgrid(grid->get_u_min(), grid->get_u_max(), grid->get_n_ulines()-1, grid->get_v_max(), grid->get_v_min(), n_vlines-1); for(j=0; j<rbArray->get_n_elements(); j++) { rectBlock* block = rbArray->get_element(j); Int low = block->get_lowGridLineIndex(); Int high = block->get_upGridLineIndex(); for(k=0, i=high; i>low; i--, k++) { backend.surfmesh(block->get_leftIndices()[k+1], n_vlines-1-i, block->get_rightIndices()[k+1]-block->get_leftIndices()[k+1], 1); } }}void Slicer::evalStream(primStream* pStream){ Int i,j,k; k=0;/* TrimVertex X;*/ TrimVertex *trimVert =/*&X*/ (TrimVertex*)malloc(sizeof(TrimVertex)); trimVert -> nuid = 0;//??? Real* vertices = pStream->get_vertices(); //for efficiency for(i=0; i<pStream->get_n_prims(); i++) { //ith primitive has #vertices = lengths[i], type=types[i] switch(pStream->get_type(i)){ case PRIMITIVE_STREAM_FAN: backend.bgntfan(); for(j=0; j<pStream->get_length(i); j++) { trimVert->param[0] = vertices[k]; trimVert->param[1] = vertices[k+1]; backend.tmeshvert(trimVert); // backend.tmeshvert(vertices[k], vertices[k+1]); k += 2; } backend.endtfan(); break; default: fprintf(stderr, "evalStream: not implemented yet\n"); exit(1); } } free(trimVert);} void Slicer::slice_new(Arc_ptr loop){//count++;//if(count == 78) count=1;//printf("count=%i\n", count);//if( ! (4<= count && count <=4)) return; Int num_ulines; Int num_vlines; Real uMin, uMax, vMin, vMax; Real mydu, mydv; uMin = uMax = loop->tail()[0]; vMin = vMax = loop->tail()[1]; mydu = (du>0)? du: -du; mydv = (dv>0)? dv: -dv; for(Arc_ptr jarc=loop->next; jarc != loop; jarc = jarc->next) { if(jarc->tail()[0] < uMin) uMin = jarc->tail()[0]; if(jarc->tail()[0] > uMax) uMax = jarc->tail()[0]; if(jarc->tail()[1] < vMin) vMin = jarc->tail()[1]; if(jarc->tail()[1] > vMax) vMax = jarc->tail()[1]; } if (uMax == uMin) return; // prevent divide-by-zero. Jon Perry. 17 June 2002 if(mydu > uMax - uMin) num_ulines = 2; else { num_ulines = 3 + (Int) ((uMax-uMin)/mydu); } if(mydv>=vMax-vMin) num_vlines = 2; else { num_vlines = 2+(Int)((vMax-vMin)/mydv); } Int isRect = is_rect(loop); if(isRect && (num_ulines<=2 || num_vlines<=2)) { if(vlinear) triangulateRect(loop, backend, 1, ulinear, vlinear); else if(ulinear) triangulateRect(loop, backend, -1, ulinear, vlinear); else triangulateRect(loop, backend, 0, ulinear, vlinear); } else if(isRect) { triangulateRectGen(loop, num_ulines-2, num_vlines-2, backend); } else if( (num_ulines<=2 || num_vlines <=2) && ulinear) { monoTriangulationFunBackend(loop, compV2InY, &backend); } else if( (!ulinear) && (!vlinear) && (num_ulines == 2) && (num_vlines > 2)) { monoTriangulationFunBackend(loop, compV2InY, &backend); } else { directedLine* poly = arcLoopToDLineLoop(loop); gridWrap grid(num_ulines, num_vlines, uMin, uMax, vMin, vMax); primStream pStream(20, 20); rectBlockArray rbArray(20); sampleMonoPoly(poly, &grid, ulinear, vlinear, &pStream, &rbArray); evalStream(&pStream); evalRBArray(&rbArray, &grid); #ifdef COUNT_TRIANGLES num_triangles += pStream.num_triangles(); num_quads += rbArray.num_quads();#endif poly->deleteSinglePolygonWithSline(); } #ifdef COUNT_TRIANGLES printf("num_triangles=%i\n", num_triangles); printf("num_quads = %i\n", num_quads);#endif}void Slicer::slice(Arc_ptr loop){#ifdef USE_READ_FLAG if(read_flag("flagFile")) slice_new(loop); else slice_old(loop);#else slice_new(loop);#endif} Slicer::Slicer( Backend &b ) : CoveAndTiler( b ), Mesher( b ), backend( b ){ ulinear = 0; vlinear = 0;}Slicer::~Slicer(){}voidSlicer::setisolines( int x ){ isolines = x;}voidSlicer::setstriptessellation( REAL x, REAL y ){ assert(x > 0 && y > 0); du = x; dv = y; setDu( du );}voidSlicer::slice_old( Arc_ptr loop ){ loop->markverts(); Arc_ptr extrema[4]; loop->getextrema( extrema ); unsigned int npts = loop->numpts(); TrimRegion::init( npts, extrema[0] ); Mesher::init( npts ); long ulines = uarray.init( du, extrema[1], extrema[3] );//printf("ulines = %i\n", ulines); Varray varray; long vlines = varray.init( dv, extrema[0], extrema[2] );//printf("vlines = %i\n", vlines); long botv = 0; long topv; TrimRegion::init( varray.varray[botv] ); getGridExtent( &extrema[0]->pwlArc->pts[0], &extrema[0]->pwlArc->pts[0] ); for( long quad=0; quad<varray.numquads; quad++ ) { backend.surfgrid( uarray.uarray[0], uarray.uarray[ulines-1], ulines-1, varray.vval[quad], varray.vval[quad+1], varray.voffset[quad+1] - varray.voffset[quad] ); for( long i=varray.voffset[quad]+1; i <= varray.voffset[quad+1]; i++ ) { topv = botv++; advance( topv - varray.voffset[quad], botv - varray.voffset[quad], varray.varray[botv] ); if( i == vlines ) getPts( extrema[2] ); else getPts( backend ); getGridExtent(); if( isolines ) { outline(); } else { if( canTile() ) coveAndTile(); else mesh(); } } }}voidSlicer::outline( void ){ GridTrimVertex upper, lower; Hull::init( ); backend.bgnoutline(); while( (nextupper( &upper )) ) { if( upper.isGridVert() ) backend.linevert( upper.g ); else backend.linevert( upper.t ); } backend.endoutline(); backend.bgnoutline(); while( (nextlower( &lower )) ) { if( lower.isGridVert() ) backend.linevert( lower.g ); else backend.linevert( lower.t ); } backend.endoutline();}voidSlicer::outline( Arc_ptr jarc ){ jarc->markverts(); if( jarc->pwlArc->npts >= 2 ) { backend.bgnoutline(); for( int j = jarc->pwlArc->npts-1; j >= 0; j-- ) backend.linevert( &(jarc->pwlArc->pts[j]) ); backend.endoutline(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -