📄 samplecomptop.cc
字号:
leftMax = leftChain->getVertex(leftEndIndex)[0] - Real(1.0); //initilza to left of leftU rightMin = rightChain->getVertex(rightEndIndex)[0]; } else { oldLeftI = leftEndIndex; oldRightI = rightEndIndex+1; leftMax = leftChain->getVertex(leftEndIndex)[0]; rightMin = rightChain->getVertex(rightEndIndex)[0] + Real(1.0); } //i: the current working leftChain index, //j: the current working rightChain index, //if left(i) is higher than right(j), then the two chains beloew right(j) are separated. //else the two chains below left(i) are separeated. i=leftEndIndex; j=rightEndIndex; while(1) { newLeftI = oldLeftI; newRightI = oldRightI; if(i<leftStartIndex) //left chain is done, go through remining right chain. { for(k=j-1; k>= rightStartIndex; k--) { if(rightChain->getVertex(k)[0] > leftMax) //no conflict { //update oldRightI if necessary if(rightChain->getVertex(k)[0] < rightMin) { rightMin = rightChain->getVertex(k)[0]; oldRightI = k; } } else //there is a conflict break; //the for-loop. below right(k-1) is seperated: oldLeftI, oldRightI. } break; //the while loop } else if(j<rightStartIndex) //rightChain is done { for(k=i-1; k>= leftStartIndex; k--) { if(leftChain->getVertex(k)[0] < rightMin) //no conflict { //update oldLeftI if necessary if(leftChain->getVertex(k)[0] > leftMax) { leftMax = leftChain->getVertex(k)[0]; oldLeftI = k; } } else //there is a conflict break; //the for loop } break; //the while loop } else if(leftChain->getVertex(i)[1] > rightChain->getVertex(j)[1]) //left hgiher { if(leftChain->getVertex(i)[0] > leftMax) //update leftMax and newLeftI. { leftMax = leftChain->getVertex(i)[0]; newLeftI = i; } for(k=j-1; k>= rightStartIndex; k--) //update rightMin and newRightI. { if(rightChain->getVertex(k)[1] > leftChain->getVertex(i)[1]) break; if(rightChain->getVertex(k)[0] < rightMin) { rightMin = rightChain->getVertex(k)[0]; newRightI = k; } } j = k; //next working j, since j will be higher than i in next loop if(leftMax >= rightMin) //there is a conflict break; else //still no conflict { oldLeftI = newLeftI; oldRightI = newRightI; } } else //right higher { if(rightChain->getVertex(j)[0] < rightMin) { rightMin = rightChain->getVertex(j)[0]; newRightI = j; } for(k=i-1; k>= leftStartIndex; k--) { if(leftChain->getVertex(k)[1] > rightChain->getVertex(j)[1]) break; if(leftChain->getVertex(k)[0] > leftMax) { leftMax = leftChain->getVertex(k)[0]; newLeftI = k; } } i = k; //next working i, since i will be higher than j next loop if(leftMax >= rightMin) //there is a conflict break; else //still no conflict { oldLeftI = newLeftI; oldRightI = newRightI; } } }//end of while loop //now oldLeftI and oldRightI are the desired separeator index, notice that there are not necessarily valid if(oldLeftI > leftEndIndex || oldRightI > rightEndIndex) return 0; else { ret_sep_left = oldLeftI; ret_sep_right = oldRightI; return 1; }} void sampleCompTop(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){ if(up_leftCornerWhere == 1 && up_rightCornerWhere == 1) //the top is topVertex with possible grid points { leftGridChain->getGrid()->outputFanWithPoint(leftGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), rightGridChain->getUlineIndex(gridIndex1), topVertex, pStream); return; } else if(up_leftCornerWhere != 0) { Real* tempTop; Int tempRightStart; if(up_leftCornerWhere == 1){ tempRightStart = rightStartIndex; tempTop = topVertex; } else { tempRightStart = up_leftCornerIndex+1; tempTop = rightChain->getVertex(up_leftCornerIndex); } sampleTopRightWithGridLine(tempTop, rightChain, tempRightStart, up_rightCornerIndex, rightGridChain->getGrid(), leftGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), rightGridChain->getUlineIndex(gridIndex1), pStream); } else if(up_rightCornerWhere != 2) { Real* tempTop; Int tempLeftStart; if(up_rightCornerWhere == 1) { tempLeftStart = leftStartIndex; tempTop = topVertex; } else //0 { tempLeftStart = up_rightCornerIndex+1; tempTop = leftChain->getVertex(up_rightCornerIndex); }/* sampleTopLeftWithGridLine(tempTop, leftChain, tempLeftStart, up_leftCornerIndex, leftGridChain->getGrid(), leftGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), rightGridChain->getUlineIndex(gridIndex1), pStream);*/ sampleCompTopSimple(topVertex, leftChain, leftStartIndex, rightChain, rightStartIndex, leftGridChain, rightGridChain, gridIndex1, up_leftCornerWhere, up_leftCornerIndex, up_rightCornerWhere, up_rightCornerIndex, pStream); } else //up_leftCornerWhere == 0, up_rightCornerWhere == 2. { sampleCompTopSimple(topVertex, leftChain, leftStartIndex, rightChain, rightStartIndex, leftGridChain, rightGridChain, gridIndex1, up_leftCornerWhere, up_leftCornerIndex, up_rightCornerWhere, up_rightCornerIndex, pStream); return;#ifdef NOT_REACHABLE //code is not reachable, for test purpose only //the following code is trying to do some optimization, but not quite working, also see sampleCompBot.C: Int sep_left, sep_right; if(findTopSeparator(leftChain, leftStartIndex, up_leftCornerIndex, rightChain, rightStartIndex, up_rightCornerIndex, sep_left, sep_right) ) //separator exists { if( leftChain->getVertex(sep_left)[0] >= leftGridChain->get_u_value(gridIndex1) && rightChain->getVertex(sep_right)[0] <= rightGridChain->get_u_value(gridIndex1)) { Int gridSep; Int segLeftSmall, segLeftLarge, segRightSmall, segRightLarge; Int valid=1; //whether the gridStep is valid or not. findTopLeftSegment(leftChain, sep_left, up_leftCornerIndex, leftGridChain->get_u_value(gridIndex1), segLeftSmall, segLeftLarge); findTopRightSegment(rightChain, sep_right, up_rightCornerIndex, rightGridChain->get_u_value(gridIndex1), segRightSmall, segRightLarge); if(leftChain->getVertex(segLeftSmall)[1] >= rightChain->getVertex(segRightSmall)[1]) { gridSep = rightGridChain->getUlineIndex(gridIndex1); while(leftGridChain->getGrid()->get_u_value(gridSep) > leftChain->getVertex(segLeftSmall)[0]) gridSep--; if(segLeftSmall<segLeftLarge) if(leftGridChain->getGrid()->get_u_value(gridSep) < leftChain->getVertex(segLeftSmall+1)[0]) { valid = 0; } } else { gridSep = leftGridChain->getUlineIndex(gridIndex1); while(leftGridChain->getGrid()->get_u_value(gridSep) < rightChain->getVertex(segRightSmall)[0]) gridSep++; if(segRightSmall<segRightLarge) if(leftGridChain->getGrid()->get_u_value(gridSep) > rightChain->getVertex(segRightSmall+1)[0]) { valid = 0; } } if(! valid) { sampleCompTopSimple(topVertex, leftChain, leftStartIndex, rightChain, rightStartIndex, leftGridChain, rightGridChain, gridIndex1, up_leftCornerWhere, up_leftCornerIndex, up_rightCornerWhere, up_rightCornerIndex, pStream); } else { sampleTopLeftWithGridLinePost(leftChain->getVertex(segLeftSmall), leftChain, segLeftSmall+1, segLeftSmall+1, segLeftLarge, up_leftCornerIndex, leftGridChain->getGrid(), leftGridChain->getVlineIndex(gridIndex1), leftGridChain->getUlineIndex(gridIndex1), gridSep, pStream); sampleTopRightWithGridLinePost(rightChain->getVertex(segRightSmall), rightChain, segRightSmall+1, segRightSmall+1, segRightLarge, up_rightCornerIndex, leftGridChain->getGrid(), leftGridChain->getVlineIndex(gridIndex1), gridSep, rightGridChain->getUlineIndex(gridIndex1), pStream); Real tempBot[2]; tempBot[0] = leftGridChain->getGrid()->get_u_value(gridSep); tempBot[1] = leftGridChain->get_v_value(gridIndex1); monoTriangulationRecGen(topVertex, tempBot, leftChain, leftStartIndex, segLeftSmall, rightChain, rightStartIndex, segRightSmall, pStream); } }//end if both sides have vetices inside the gridboundary points else if(leftChain->getVertex(sep_left)[0] >= leftGridChain->get_u_value(gridIndex1)) //left is in, right is nout { Int segLeftSmall, segLeftLarge; findTopLeftSegment(leftChain, sep_left, up_leftCornerIndex, leftGridChain->get_u_value(gridIndex1), segLeftSmall, segLeftLarge); assert(segLeftLarge >= sep_left); monoTriangulation2(leftChain->getVertex(segLeftLarge), leftGridChain->get_vertex(gridIndex1), leftChain, segLeftLarge+1, up_leftCornerIndex, 1, //a increase chain, pStream); stripOfFanLeft(leftChain, segLeftLarge, segLeftSmall, leftGridChain->getGrid(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -