📄 samplecomptop.cc
字号:
leftGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), rightGridChain->getUlineIndex(gridIndex1), pStream, 0); monoTriangulationRecGen(topVertex, rightGridChain->get_vertex(gridIndex1), leftChain, leftStartIndex, segLeftSmall, rightChain, rightStartIndex, up_rightCornerIndex, pStream); }//end left in right out else if(rightChain->getVertex(sep_right)[0] <= rightGridChain->get_u_value(gridIndex1)) { Int segRightSmall, segRightLarge; findTopRightSegment(rightChain, sep_right, up_rightCornerIndex, rightGridChain->get_u_value(gridIndex1), segRightSmall, segRightLarge); assert(segRightLarge>=sep_right); monoTriangulation2(rightChain->getVertex(segRightLarge), rightGridChain->get_vertex(gridIndex1), rightChain, segRightLarge+1, up_rightCornerIndex, 0, //a decrease chain pStream); stripOfFanRight(rightChain, segRightLarge, segRightSmall, rightGridChain->getGrid(), rightGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), rightGridChain->getUlineIndex(gridIndex1), pStream, 0); monoTriangulationRecGen(topVertex, leftGridChain->get_vertex(gridIndex1), leftChain, leftStartIndex, up_leftCornerIndex, rightChain, rightStartIndex,segRightSmall, pStream); }//end left out rigth in else //left out , right out { sampleCompTopSimple(topVertex, leftChain, leftStartIndex, rightChain, rightStartIndex, leftGridChain, rightGridChain, gridIndex1, up_leftCornerWhere, up_leftCornerIndex, up_rightCornerWhere, up_rightCornerIndex, pStream); }//end leftout, right out }//end if separator exixts. else //no separator { sampleCompTopSimple(topVertex, leftChain, leftStartIndex, rightChain, rightStartIndex, leftGridChain, rightGridChain, gridIndex1, up_leftCornerWhere, up_leftCornerIndex, up_rightCornerWhere, up_rightCornerIndex, pStream); }#endif }//end if 0,2}//end if the function static void sampleCompTopSimpleOpt(gridWrap* grid, Int gridV, Real* topVertex, Real* botVertex, vertexArray* inc_chain, Int inc_current, Int inc_end, vertexArray* dec_chain, Int dec_current, Int dec_end, primStream* pStream){ if(gridV <= 0 || dec_end<dec_current || inc_end <inc_current) { monoTriangulationRecGenOpt(topVertex, botVertex, inc_chain, inc_current, inc_end, dec_chain, dec_current, dec_end, pStream); return; } if(grid->get_v_value(gridV+1) >= topVertex[1]) { monoTriangulationRecGenOpt(topVertex, botVertex, inc_chain, inc_current, inc_end, dec_chain, dec_current, dec_end, pStream); return; } Int i,j,k; Real currentV = grid->get_v_value(gridV+1); if(inc_chain->getVertex(inc_end)[1] <= currentV && dec_chain->getVertex(dec_end)[1] < currentV) { //find i bottom up so that inc_chain[i]<= curentV and inc_chain[i-1] > currentV, //find j botom up so that dec_chain[j] < currentV and dec_chain[j-1] >= currentV for(i=inc_end; i >= inc_current; i--) { if(inc_chain->getVertex(i)[1] > currentV) break; } i++; for(j=dec_end; j >= dec_current; j--) { if(dec_chain->getVertex(j)[1] >= currentV) break; } j++; if(inc_chain->getVertex(i)[1] <= dec_chain->getVertex(j)[1]) { //find the k so that dec_chain[k][1] < inc_chain[i][1] for(k=j; k<=dec_end; k++) { if(dec_chain->getVertex(k)[1] < inc_chain->getVertex(i)[1]) break; } //we know that dec_chain[j][1] >= inc_chian[i][1] //we know that dec_chain[k-1][1]>=inc_chain[i][1] //we know that dec_chian[k][1] < inc_chain[i][1] //find l in [j, k-1] so that dec_chain[l][0] 0 is closest to // inc_chain[i] int l; Real tempI = Real(j); Real tempMin = (Real)fabs(inc_chain->getVertex(i)[0] - dec_chain->getVertex(j)[0]); for(l=j+1; l<= k-1; l++) { if(fabs(inc_chain->getVertex(i)[0] - dec_chain->getVertex(l)[0]) <= tempMin) { tempMin = (Real)fabs(inc_chain->getVertex(i)[0] - dec_chain->getVertex(l)[0]); tempI = (Real)l; } } //inc_chain[i] and dec_chain[tempI] are connected. monoTriangulationRecGenOpt(dec_chain->getVertex((int)tempI), botVertex, inc_chain, i, inc_end, dec_chain, (int)(tempI+1), dec_end, pStream); //recursively do the rest sampleCompTopSimpleOpt(grid, gridV+1, topVertex, inc_chain->getVertex(i), inc_chain, inc_current, i-1, dec_chain, dec_current, (int)tempI, pStream); } else { //find the k so that inc_chain[k][1] <= dec_chain[j][1] for(k=i; k<=inc_end; k++) { if(inc_chain->getVertex(k)[1] <= dec_chain->getVertex(j)[1]) break; } //we know that inc_chain[i] > dec_chain[j] //we know that inc_chain[k-1][1] > dec_chain[j][1] //we know that inc_chain[k][1] <= dec_chain[j][1] //so we find l between [i,k-1] so that //inc_chain[l][0] is the closet to dec_chain[j][0] int tempI = i; int l; Real tempMin = (Real)fabs(inc_chain->getVertex(i)[0] - dec_chain->getVertex(j)[0]); for(l=i+1; l<=k-1; l++) { if(fabs(inc_chain->getVertex(l)[0] - dec_chain->getVertex(j)[0]) <= tempMin) { tempMin = (Real)fabs(inc_chain->getVertex(l)[0] - dec_chain->getVertex(j)[0]); tempI = l; } } //inc_chain[tempI] and dec_chain[j] are connected monoTriangulationRecGenOpt(inc_chain->getVertex(tempI), botVertex, inc_chain, tempI+1, inc_end, dec_chain, j, dec_end, pStream); //recurvesily do the rest sampleCompTopSimpleOpt(grid, gridV+1, topVertex, dec_chain->getVertex(j), inc_chain, inc_current, tempI, dec_chain, dec_current, j-1, pStream); } } else //go to the next higher gridV { sampleCompTopSimpleOpt(grid, gridV+1, topVertex, botVertex, inc_chain, inc_current, inc_end, dec_chain, dec_current, dec_end, pStream); }} void sampleCompTopSimple(Real* topVertex, vertexArray* leftChain, Int leftStartIndex, vertexArray* rightChain, Int rightStartIndex, gridBoundaryChain* leftGridChain, gridBoundaryChain* rightGridChain, Int gridIndex1, Int up_leftCornerWhere, Int up_leftCornerIndex, Int up_rightCornerWhere, Int up_rightCornerIndex, primStream* pStream){ //the plan is to use monotriangulation algortihm. Int i,k; Real* ActualTop; Real* ActualBot; Int ActualLeftStart, ActualLeftEnd; Int ActualRightStart, ActualRightEnd; //creat an array to store the points on the grid line gridWrap* grid = leftGridChain->getGrid(); Int gridV = leftGridChain->getVlineIndex(gridIndex1); Int gridLeftU = leftGridChain->getUlineIndex(gridIndex1); Int gridRightU = rightGridChain->getUlineIndex(gridIndex1); Real2* gridPoints = (Real2*) malloc(sizeof(Real2) * (gridRightU - gridLeftU +1)); assert(gridPoints); for(k=0, i=gridRightU; i>= gridLeftU; i--, k++) { gridPoints[k][0] = grid->get_u_value(i); gridPoints[k][1] = grid->get_v_value(gridV); } if(up_leftCornerWhere != 2) ActualRightStart = rightStartIndex; else ActualRightStart = up_leftCornerIndex+1; //up_leftCornerIndex will be the ActualTop if(up_rightCornerWhere != 2) //right corner is not on right chain ActualRightEnd = rightStartIndex-1; //meaning that there is no actual rigth section else ActualRightEnd = up_rightCornerIndex; vertexArray ActualRightChain(max(0, ActualRightEnd-ActualRightStart+1) + gridRightU-gridLeftU+1); for(i=ActualRightStart; i<= ActualRightEnd; i++) ActualRightChain.appendVertex(rightChain->getVertex(i)); for(i=0; i<gridRightU-gridLeftU+1; i++) ActualRightChain.appendVertex(gridPoints[i]); //determine ActualLeftEnd if(up_leftCornerWhere != 0) ActualLeftEnd = leftStartIndex-1; else ActualLeftEnd = up_leftCornerIndex; if(up_rightCornerWhere != 0) ActualLeftStart = leftStartIndex; else ActualLeftStart = up_rightCornerIndex+1; //up_rightCornerIndex will be the actual top if(up_leftCornerWhere == 0) { if(up_rightCornerWhere == 0) ActualTop = leftChain->getVertex(up_rightCornerIndex); else ActualTop = topVertex; } else if(up_leftCornerWhere == 1) ActualTop = topVertex; else //up_leftCornerWhere == 2 ActualTop = rightChain->getVertex(up_leftCornerIndex); ActualBot = gridPoints[gridRightU - gridLeftU]; if(leftChain->getVertex(ActualLeftEnd)[1] == ActualBot[1]) {/* monoTriangulationRecGenOpt(ActualTop, leftChain->getVertex(ActualLeftEnd), leftChain, ActualLeftStart, ActualLeftEnd-1, &ActualRightChain, 0, ActualRightChain.getNumElements()-1, pStream);*/ sampleCompTopSimpleOpt(grid, gridV, ActualTop, leftChain->getVertex(ActualLeftEnd), leftChain, ActualLeftStart, ActualLeftEnd-1, &ActualRightChain, 0, ActualRightChain.getNumElements()-1, pStream); } else {/* monoTriangulationRecGenOpt(ActualTop, ActualBot, leftChain, ActualLeftStart, ActualLeftEnd, &ActualRightChain, 0, ActualRightChain.getNumElements()-2, //the last is the bot. pStream);*/ sampleCompTopSimpleOpt(grid, gridV, ActualTop, ActualBot, leftChain, ActualLeftStart, ActualLeftEnd, &ActualRightChain, 0, ActualRightChain.getNumElements()-2, //the last is the bot. pStream); } free(gridPoints); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -