44 #define max(a,b) ((a>b)? a:b)
47 #define min(a,b) ((a>b)? b:a)
50 #include <libnurbs2.h>
53 #include "glimports.h"
55 #include "sampleMonoPoly.h"
56 #include "sampleComp.h"
58 #include "partitionX.h"
79 sline->setPoint(0, polygon->getVertex(0));
80 sline->setPoint(1, polygon->getVertex(1));
82 for(i=1; i<= polygon->get_npoints()-2; i++)
85 sline->setPoint(0, polygon->getVertex(i));
86 sline->setPoint(1, polygon->getVertex(i+1));
90 for(
directedLine *temp = polygon->getNext(); temp != polygon; temp = temp->getNext())
92 for(i=0; i<= temp->get_npoints()-2; i++)
95 sline->setPoint(0, temp->getVertex(i));
96 sline->setPoint(1, temp->getVertex(i+1));
112 for(tempV = topV; tempV != botV; tempV = tempV->getNext())
114 n_leftVerts += tempV->get_npoints();
117 for(tempV = botV; tempV != topV; tempV = tempV->getNext())
119 n_rightVerts += tempV->get_npoints();
122 Real2* temp_leftVerts = (Real2 *) malloc(
sizeof(Real2) * n_leftVerts);
123 assert(temp_leftVerts);
124 Real2* temp_rightVerts = (Real2 *) malloc(
sizeof(Real2) * n_rightVerts);
125 assert(temp_rightVerts);
127 leftVerts = (Real**) malloc(
sizeof(Real2*) * n_leftVerts);
129 rightVerts = (Real**) malloc(
sizeof(Real2*) * n_rightVerts);
131 for(i=0; i<n_leftVerts; i++)
132 leftVerts[i] = temp_leftVerts[i];
133 for(i=0; i<n_rightVerts; i++)
134 rightVerts[i] = temp_rightVerts[i];
137 for(tempV = topV; tempV != botV; tempV = tempV->getNext())
139 for(j=1; j<tempV->get_npoints(); j++)
141 leftVerts[i][0] = tempV->getVertex(j)[0];
142 leftVerts[i][1] = tempV->getVertex(j)[1];
148 for(tempV = topV->getPrev(); tempV != botV->getPrev(); tempV = tempV->getPrev())
150 for(j=tempV->get_npoints()-1; j>=1; j--)
152 rightVerts[i][0] = tempV->getVertex(j)[0];
153 rightVerts[i][1] = tempV->getVertex(j)[1];
158 triangulateXYMonoTB(n_leftVerts, leftVerts, n_rightVerts, rightVerts, pStream);
161 free(temp_leftVerts);
162 free(temp_rightVerts);
174 for(tempV = leftV; tempV != rightV; tempV = tempV->getNext())
176 n_lowerVerts += tempV->get_npoints();
179 for(tempV = rightV; tempV != leftV; tempV = tempV->getNext())
181 n_upperVerts += tempV->get_npoints();
183 lowerVerts = (Real2 *) malloc(
sizeof(Real2) * n_lowerVerts);
184 assert(n_lowerVerts);
185 upperVerts = (Real2 *) malloc(
sizeof(Real2) * n_upperVerts);
186 assert(n_upperVerts);
188 for(tempV = leftV; tempV != rightV; tempV = tempV->getNext())
190 for(j=0; j<tempV->get_npoints(); j++)
192 lowerVerts[i][0] = tempV->getVertex(j)[0];
193 lowerVerts[i][1] = tempV->getVertex(j)[1];
198 for(tempV = leftV->getPrev(); tempV != rightV->getPrev(); tempV = tempV->getPrev())
200 for(j=tempV->get_npoints()-1; j>=0; j--)
202 upperVerts[i][0] = tempV->getVertex(j)[0];
203 upperVerts[i][1] = tempV->getVertex(j)[1];
207 triangulateXYMono(n_upperVerts, upperVerts, n_lowerVerts, lowerVerts, pStream);
220 topV = botV = polygon;
222 for(tempV = polygon->getNext(); tempV != polygon; tempV = tempV->getNext())
224 if(compV2InY(topV->head(), tempV->head())<0) {
228 if(compV2InY(botV->head(), tempV->head())>0) {
234 for(tempV = topV; tempV != botV; tempV = tempV->getNext())
236 if(tempV->tail()[0] >= tempV->head()[0])
241 for(tempV = botV; tempV != topV; tempV = tempV->getNext())
243 if(tempV->tail()[0] <= tempV->head()[0])
249 triangulateConvexPolyHoriz( leftV, rightV, pStream);
253 triangulateConvexPolyVertical(topV, botV, pStream);
257 if(DBG_is_U_direction(polygon))
259 triangulateConvexPolyHoriz( leftV, rightV, pStream);
262 triangulateConvexPolyVertical(topV, botV, pStream);
268 Real* topV, Real* botV,
277 Int rightCornerWhere,
278 Int rightCornerIndex,
279 Int bot_leftCornerWhere,
280 Int bot_leftCornerIndex,
281 Int bot_rightCornerWhere,
282 Int bot_rightCornerIndex)
286 Real* bot_leftCornerV;
287 Real* bot_rightCornerV;
289 if(leftCornerWhere == 1)
291 else if(leftCornerWhere == 0)
292 leftCornerV = leftChain->getVertex(leftCornerIndex);
294 leftCornerV = rightChain->getVertex(leftCornerIndex);
296 if(rightCornerWhere == 1)
298 else if(rightCornerWhere == 0)
299 rightCornerV = leftChain->getVertex(rightCornerIndex);
301 rightCornerV = rightChain->getVertex(rightCornerIndex);
303 if(bot_leftCornerWhere == 1)
304 bot_leftCornerV = botV;
305 else if(bot_leftCornerWhere == 0)
306 bot_leftCornerV = leftChain->getVertex(bot_leftCornerIndex);
308 bot_leftCornerV = rightChain->getVertex(bot_leftCornerIndex);
310 if(bot_rightCornerWhere == 1)
311 bot_rightCornerV = botV;
312 else if(bot_rightCornerWhere == 0)
313 bot_rightCornerV = leftChain->getVertex(bot_rightCornerIndex);
315 bot_rightCornerV = rightChain->getVertex(bot_rightCornerIndex);
317 Real topGridV = leftGridChain->get_v_value(gridIndex1);
318 Real topGridU1 = leftGridChain->get_u_value(gridIndex1);
319 Real topGridU2 = rightGridChain->get_u_value(gridIndex1);
320 Real botGridV = leftGridChain->get_v_value(gridIndex2);
321 Real botGridU1 = leftGridChain->get_u_value(gridIndex2);
322 Real botGridU2 = rightGridChain->get_u_value(gridIndex2);
325 glBegin(GL_LINE_STRIP);
326 glVertex2fv(leftCornerV);
327 glVertex2f(topGridU1, topGridV);
330 glBegin(GL_LINE_STRIP);
331 glVertex2fv(rightCornerV);
332 glVertex2f(topGridU2, topGridV);
335 glBegin(GL_LINE_STRIP);
336 glVertex2fv(bot_leftCornerV);
337 glVertex2f(botGridU1, botGridV);
340 glBegin(GL_LINE_STRIP);
341 glVertex2fv(bot_rightCornerV);
342 glVertex2f(botGridU2, botGridV);
352 for(i=1; i<=topV->get_npoints()-2; i++) {
353 leftChain.appendVertex(topV->getVertex(i));
355 for(tempV = topV->getNext(); tempV != botV; tempV = tempV->getNext())
357 for(i=0; i<=tempV->get_npoints()-2; i++){
358 leftChain.appendVertex(tempV->getVertex(i));
362 for(tempV = topV->getPrev(); tempV != botV; tempV = tempV->getPrev())
364 for(i=tempV->get_npoints()-2; i>=0; i--){
365 rightChain.appendVertex(tempV->getVertex(i));
368 for(i=botV->get_npoints()-2; i>=1; i--){
369 rightChain.appendVertex(tempV->getVertex(i));
378 topV = botV = polygon;
379 for(tempV = polygon->getNext(); tempV != polygon; tempV = tempV->getNext())
381 if(compV2InY(topV->head(), tempV->head())<0) {
384 if(compV2InY(botV->head(), tempV->head())>0) {
401 firstGridIndex = (Int) ((topV->head()[1] - grid->get_v_min()) / (grid->get_v_max() - grid->get_v_min()) * (grid->get_n_vlines()-1));
403 if(botV->head()[1] < grid->get_v_min())
406 lastGridIndex = (Int) ((botV->head()[1] - grid->get_v_min()) / (grid->get_v_max() - grid->get_v_min()) * (grid->get_n_vlines()-1)) + 1;
409 Int *leftGridIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
410 assert(leftGridIndices);
411 Int *rightGridIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
412 assert(rightGridIndices);
413 Int *leftGridInnerIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
414 assert(leftGridInnerIndices);
415 Int *rightGridInnerIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
416 assert(rightGridInnerIndices);
418 findLeftGridIndices(topV, firstGridIndex, lastGridIndex, grid, leftGridIndices, leftGridInnerIndices);
420 findRightGridIndices(topV, firstGridIndex, lastGridIndex, grid, rightGridIndices, rightGridInnerIndices);
422 leftGridChain =
new gridBoundaryChain(grid, firstGridIndex, firstGridIndex-lastGridIndex+1, leftGridIndices, leftGridInnerIndices);
424 rightGridChain =
new gridBoundaryChain(grid, firstGridIndex, firstGridIndex-lastGridIndex+1, rightGridIndices, rightGridInnerIndices);
426 free(leftGridIndices);
427 free(rightGridIndices);
428 free(leftGridInnerIndices);
429 free(rightGridInnerIndices);
432 void findDownCorners(Real *botVertex,
433 vertexArray *leftChain, Int leftChainStartIndex, Int leftChainEndIndex,
434 vertexArray *rightChain, Int rightChainStartIndex, Int rightChainEndIndex,
438 Int& ret_leftCornerWhere,
439 Int& ret_leftCornerIndex,
440 Int& ret_rightCornerWhere,
441 Int& ret_rightCornerIndex
445 printf(
"*************enter find donw corner\n");
446 printf(
"finddownCorner: v=%f, uleft=%f, uright=%f\n", v, uleft, uright);
447 printf(
"(%i,%i,%i,%i)\n", leftChainStartIndex, leftChainEndIndex,rightChainStartIndex, rightChainEndIndex);
448 printf(
"left chain is\n");
450 printf(
"right chain is\n");
454 assert(v > botVertex[1]);
455 Real leftGridPoint[2];
456 leftGridPoint[0] = uleft;
457 leftGridPoint[1] = v;
458 Real rightGridPoint[2];
459 rightGridPoint[0] = uright;
460 rightGridPoint[1] = v;
465 index1 = leftChain->findIndexBelowGen(v, leftChainStartIndex, leftChainEndIndex);
466 index2 = rightChain->findIndexBelowGen(v, rightChainStartIndex, rightChainEndIndex);
468 if(index2 <= rightChainEndIndex)
469 index2 = rightChain->skipEqualityFromStart(v, index2, rightChainEndIndex);
471 if(index1>leftChainEndIndex && index2 > rightChainEndIndex)
475 ret_leftCornerWhere = 1;
476 ret_rightCornerWhere = 1;
478 else if(index1>leftChainEndIndex )
481 ret_rightCornerWhere = 2;
482 ret_rightCornerIndex = index2;
485 Real tempMin = rightChain->getVertex(index2)[0];
487 for(i=index2+1; i<= rightChainEndIndex; i++)
488 if(rightChain->getVertex(i)[0] < tempMin)
491 tempMin = rightChain->getVertex(i)[0];
497 if(DBG_intersectChain(rightChain, rightChainStartIndex,rightChainEndIndex,
498 leftGridPoint, botVertex))
500 ret_leftCornerWhere = 2;
501 ret_leftCornerIndex = index2;
503 else if(botVertex[0] < tempMin)
504 ret_leftCornerWhere = 1;
507 ret_leftCornerWhere = 2;
508 ret_leftCornerIndex = tempI;
511 else if(index2> rightChainEndIndex)
513 ret_leftCornerWhere = 0;
514 ret_leftCornerIndex = index1;
522 for(tempI = index1; tempI <= leftChainEndIndex; tempI++)
523 if(leftChain->getVertex(tempI)[1] < v)
525 if(tempI > leftChainEndIndex)
526 ret_rightCornerWhere = 1;
529 Real tempMax = leftChain->getVertex(tempI)[0];
530 for(i=tempI; i<= leftChainEndIndex; i++)
531 if(leftChain->getVertex(i)[0] > tempMax)
534 tempMax = leftChain->getVertex(i)[0];
541 if(DBG_intersectChain(leftChain, leftChainStartIndex,leftChainEndIndex,
542 rightGridPoint, botVertex))
544 ret_rightCornerWhere = 0;
545 ret_rightCornerIndex = index1;
547 else if(botVertex[0] > tempMax)
550 ret_rightCornerWhere = 1;
554 ret_rightCornerWhere = 0;
555 ret_rightCornerIndex = tempI;
562 if(leftChain->getVertex(index1)[1] >= rightChain->getVertex(index2)[1])
564 ret_leftCornerWhere = 0;
565 ret_leftCornerIndex = index1;
571 tempMax = leftChain->getVertex(index1)[0];
574 for(i=index1+1; i<= leftChainEndIndex; i++)
576 if(leftChain->getVertex(i)[1] < rightChain->getVertex(index2)[1])
579 if(leftChain->getVertex(i)[0]>tempMax)
582 tempMax = leftChain->getVertex(i)[0];
587 if(DBG_intersectChain(leftChain, leftChainStartIndex,leftChainEndIndex, rightGridPoint, rightChain->getVertex(index2)))
589 ret_rightCornerWhere = 0;
590 ret_rightCornerIndex = index1;
592 else if(tempMax >= rightChain->getVertex(index2)[0] ||
597 ret_rightCornerWhere = 0;
598 ret_rightCornerIndex = tempI;
602 ret_rightCornerWhere = 2;
603 ret_rightCornerIndex = index2;
608 ret_rightCornerWhere = 2;
609 ret_rightCornerIndex = index2;
615 tempMin = rightChain->getVertex(index2)[0];
618 for(i=index2+1; i<= rightChainEndIndex; i++)
620 if( rightChain->getVertex(i)[1] < leftChain->getVertex(index1)[1])
622 if(rightChain->getVertex(i)[0] < tempMin)
625 tempMin = rightChain->getVertex(i)[0];
631 if(DBG_intersectChain(rightChain, rightChainStartIndex, rightChainEndIndex, leftGridPoint, leftChain->getVertex(index1)))
633 ret_leftCornerWhere = 2;
634 ret_leftCornerIndex = index2;
636 else if(tempMin <= leftChain->getVertex(index1)[0] ||
639 ret_leftCornerWhere = 2;
640 ret_leftCornerIndex = tempI;
644 ret_leftCornerWhere = 0;
645 ret_leftCornerIndex = index1;
653 void findUpCorners(Real *topVertex,
654 vertexArray *leftChain, Int leftChainStartIndex, Int leftChainEndIndex,
655 vertexArray *rightChain, Int rightChainStartIndex, Int rightChainEndIndex,
659 Int& ret_leftCornerWhere,
660 Int& ret_leftCornerIndex,
661 Int& ret_rightCornerWhere,
662 Int& ret_rightCornerIndex
666 printf(
"***********enter findUpCorners\n");
669 assert(v < topVertex[1]);
670 Real leftGridPoint[2];
671 leftGridPoint[0] = uleft;
672 leftGridPoint[1] = v;
673 Real rightGridPoint[2];
674 rightGridPoint[0] = uright;
675 rightGridPoint[1] = v;
680 index1 = leftChain->findIndexFirstAboveEqualGen(v, leftChainStartIndex, leftChainEndIndex);
683 index2 = rightChain->findIndexFirstAboveEqualGen(v, rightChainStartIndex, rightChainEndIndex);
685 if(index2>= leftChainStartIndex)
686 index2 = rightChain->skipEqualityFromStart(v, index2, rightChainEndIndex);
688 if(index1<leftChainStartIndex && index2 <rightChainStartIndex)
691 ret_leftCornerWhere = 1;
692 ret_rightCornerWhere = 1;
694 else if(index1<leftChainStartIndex )
696 ret_rightCornerWhere = 2;
697 ret_rightCornerIndex = index2;
700 Real tempMin = rightChain->getVertex(index2)[0];
702 for(i=index2-1; i>=rightChainStartIndex; i--)
703 if(rightChain->getVertex(i)[0] < tempMin)
705 tempMin = rightChain->getVertex(i)[0];
711 if(DBG_intersectChain(rightChain, rightChainStartIndex, rightChainEndIndex,
712 leftGridPoint, topVertex))
714 ret_leftCornerWhere = 2;
715 ret_leftCornerIndex = index2;
717 else if(topVertex[0] < tempMin)
718 ret_leftCornerWhere = 1;
721 ret_leftCornerWhere = 2;
722 ret_leftCornerIndex = tempI;
726 else if(index2< rightChainStartIndex)
728 ret_leftCornerWhere = 0;
729 ret_leftCornerIndex = index1;
732 Real tempMax = leftChain->getVertex(index1)[0];
735 for(i=index1-1; i>=leftChainStartIndex; i--){
737 if(leftChain->getVertex(i)[0] > tempMax)
740 tempMax = leftChain->getVertex(i)[0];
747 if(DBG_intersectChain(leftChain, leftChainStartIndex,leftChainEndIndex,
748 rightGridPoint, topVertex))
750 ret_rightCornerWhere = 0;
751 ret_rightCornerIndex = index1;
753 else if(topVertex[0] > tempMax)
754 ret_rightCornerWhere = 1;
757 ret_rightCornerWhere = 0;
758 ret_rightCornerIndex = tempI;
763 if(leftChain->getVertex(index1)[1] <= rightChain->getVertex(index2)[1])
765 ret_leftCornerWhere = 0;
766 ret_leftCornerIndex = index1;
772 tempMax = leftChain->getVertex(index1)[0];
775 for(i=index1-1; i>= leftChainStartIndex; i--)
777 if(leftChain->getVertex(i)[1] > rightChain->getVertex(index2)[1])
780 if(leftChain->getVertex(i)[0]>tempMax)
783 tempMax = leftChain->getVertex(i)[0];
787 if(DBG_intersectChain(leftChain, leftChainStartIndex, leftChainEndIndex, rightGridPoint, rightChain->getVertex(index2)))
789 ret_rightCornerWhere = 0;
790 ret_rightCornerIndex = index1;
792 else if(tempMax >= rightChain->getVertex(index2)[0] ||
795 ret_rightCornerWhere = 0;
796 ret_rightCornerIndex = tempI;
800 ret_rightCornerWhere = 2;
801 ret_rightCornerIndex = index2;
806 ret_rightCornerWhere = 2;
807 ret_rightCornerIndex = index2;
813 tempMin = rightChain->getVertex(index2)[0];
816 for(i=index2-1; i>= rightChainStartIndex; i--)
818 if( rightChain->getVertex(i)[1] > leftChain->getVertex(index1)[1])
820 if(rightChain->getVertex(i)[0] < tempMin)
823 tempMin = rightChain->getVertex(i)[0];
827 if(DBG_intersectChain(rightChain, rightChainStartIndex, rightChainEndIndex,
828 leftGridPoint, leftChain->getVertex(index1)))
830 ret_leftCornerWhere = 2;
831 ret_leftCornerIndex = index2;
833 else if(tempMin <= leftChain->getVertex(index1)[0] ||
836 ret_leftCornerWhere = 2;
837 ret_leftCornerIndex = tempI;
841 ret_leftCornerWhere = 0;
842 ret_leftCornerIndex = index1;
847 printf(
"***********leave findUpCorners\n");
852 Int findNeckF(
vertexArray *leftChain, Int botLeftIndex,
870 Int n_vlines = leftGridChain->get_nVlines();
872 if(botLeftIndex >= leftChain->getNumElements() ||
873 botRightIndex >= rightChain->getNumElements())
876 v=min(leftChain->getVertex(botLeftIndex)[1], rightChain->getVertex(botRightIndex)[1]);
881 for(i=gridStartIndex; i<n_vlines; i++)
882 if(leftGridChain->get_v_value(i) <= v &&
883 leftGridChain->getUlineIndex(i)<= rightGridChain->getUlineIndex(i))
888 if(lowerGridIndex == n_vlines)
892 Int botLeft2, botRight2;
899 botLeft2 = leftChain->findIndexFirstAboveEqualGen(leftGridChain->get_v_value(lowerGridIndex), botLeftIndex, leftChain->getNumElements()-1) -1 ;
906 botRight2 = rightChain->findIndexFirstAboveEqualGen(leftGridChain->get_v_value(lowerGridIndex), botRightIndex, rightChain->getNumElements()-1) -1;
907 if(botRight2 < botRightIndex) botRight2=botRightIndex;
909 if(botLeft2 < botLeftIndex) botLeft2 = botLeftIndex;
911 assert(botLeft2 >= botLeftIndex);
912 assert(botRight2 >= botRightIndex);
915 Int tempI = botLeftIndex;
916 Real temp = leftChain->getVertex(tempI)[0];
917 for(i=botLeftIndex+1; i<= botLeft2; i++)
918 if(leftChain->getVertex(i)[0] > temp)
920 temp = leftChain->getVertex(i)[0];
925 tempI = botRightIndex;
926 temp = rightChain->getVertex(tempI)[0];
927 for(i=botRightIndex+1; i<= botRight2; i++)
928 if(rightChain->getVertex(i)[0] < temp)
930 temp = rightChain->getVertex(i)[0];
943 void findNeck(
vertexArray *leftChain, Int botLeftIndex,
949 assert(botLeftIndex < leftChain->getNumElements() &&
950 botRightIndex < rightChain->getNumElements());
954 if(leftChain->getVertex(botLeftIndex)[1] <= rightChain->getVertex(botRightIndex)[1])
957 leftLastIndex = botLeftIndex;
961 rightLastIndex=rightChain->findIndexAboveGen(leftChain->getVertex(botLeftIndex)[1], botRightIndex+1, rightChain->getNumElements()-1);
966 rightLastIndex = botRightIndex;
968 leftLastIndex = leftChain->findIndexAboveGen(rightChain->getVertex(botRightIndex)[1],
970 leftChain->getNumElements()-1);
976 void findLeftGridIndices(
directedLine* topEdge, Int firstGridIndex, Int lastGridIndex,
gridWrap* grid, Int* ret_indices, Int* ret_innerIndices)
980 Int n_ulines = grid->get_n_ulines();
981 Real uMin = grid->get_u_min();
982 Real uMax = grid->get_u_max();
987 Real slop = 0.0, uinterc;
989 #ifdef SHORTEN_GRID_LINE
992 Real *uintercBuf = (Real *) malloc (
sizeof(Real) * (firstGridIndex-lastGridIndex+1));
998 Real vtail = grid->get_v_value(firstGridIndex) + 1.0;
999 Real tempMaxU = grid->get_u_min();
1003 for(k=0, i=firstGridIndex; i>=lastGridIndex; i--, k++)
1006 Real grid_v_value = grid->get_v_value(i);
1009 if(vtail > grid_v_value)
1014 while( (vtail=dLine->tail()[1]) > grid_v_value){
1016 tempMaxU = max(tempMaxU, dLine->tail()[0]);
1017 dLine = dLine -> getNext();
1020 if( fabs(dLine->head()[1] - vtail) < ZERO)
1025 slop = (dLine->head()[0] - dLine->tail()[0]) / (dLine->head()[1]-vtail);
1031 uinterc = max(dLine->head()[0], dLine->tail()[0]);
1035 uinterc = slop * (grid_v_value - vtail) + dLine->tail()[0];
1038 tempMaxU = max(tempMaxU, uinterc);
1040 if(uinterc < uMin && uinterc >= uMin - ZERO)
1042 if(uinterc > uMax && uinterc <= uMax + ZERO)
1045 #ifdef SHORTEN_GRID_LINE
1046 uintercBuf[k] = uinterc;
1049 assert(uinterc >= uMin && uinterc <= uMax);
1051 ret_indices[k] = n_ulines-1;
1053 ret_indices[k] = (Int)(((uinterc-uMin)/(uMax - uMin)) * (n_ulines-1)) + 1;
1054 if(ret_indices[k] >= n_ulines)
1055 ret_indices[k] = n_ulines-1;
1058 ret_innerIndices[k] = (Int)(((tempMaxU-uMin)/(uMax - uMin)) * (n_ulines-1)) + 1;
1063 #ifdef SHORTEN_GRID_LINE
1068 for(k=0, i=firstGridIndex; i>=lastGridIndex; i--, k++)
1072 Real a = grid->get_u_value(ret_indices[k]-1);
1073 Real b = grid->get_u_value(ret_indices[k]);
1074 assert(uintercBuf[k] >= a && uintercBuf < b);
1075 if( (b-uintercBuf[k]) <= 0.2 * (b-a))
1083 if(ret_innerIndices[k] < ret_indices[k-1])
1084 ret_innerIndices[k] = ret_indices[k-1];
1085 if(ret_innerIndices[k] < ret_indices[k])
1086 ret_innerIndices[k] = ret_indices[k];
1094 void findRightGridIndices(
directedLine* topEdge, Int firstGridIndex, Int lastGridIndex,
gridWrap* grid, Int* ret_indices, Int* ret_innerIndices)
1098 Int n_ulines = grid->get_n_ulines();
1099 Real uMin = grid->get_u_min();
1100 Real uMax = grid->get_u_max();
1105 Real slop = 0.0, uinterc;
1107 #ifdef SHORTEN_GRID_LINE
1110 Real *uintercBuf = (Real *) malloc (
sizeof(Real) * (firstGridIndex-lastGridIndex+1));
1116 Real vhead = dLine->tail()[1];
1117 Real tempMinU = grid->get_u_max();
1120 for(k=0, i=firstGridIndex; i>=lastGridIndex; i--, k++)
1123 Real grid_v_value = grid->get_v_value(i);
1127 if(vhead >= grid_v_value)
1132 while( (vhead=dLine->head()[1]) > grid_v_value){
1133 tempMinU = min(tempMinU, dLine->head()[0]);
1134 dLine = dLine -> getPrev();
1138 while(dLine->head()[1] == grid_v_value)
1139 dLine = dLine->getPrev();
1141 assert( dLine->tail()[1] != dLine->head()[1]);
1142 slop = (dLine->tail()[0] - dLine->head()[0]) / (dLine->tail()[1]-dLine->head()[1]);
1153 uinterc = slop * (grid_v_value - dLine->head()[1]) + dLine->head()[0];
1158 else if(uinterc > uMax)
1161 #ifdef SHORTEN_GRID_LINE
1162 uintercBuf[k] = uinterc;
1165 tempMinU = min(tempMinU, uinterc);
1167 assert(uinterc >= uMin && uinterc <= uMax);
1172 ret_indices[k] = (int)ceil((((uinterc-uMin)/(uMax - uMin)) * (n_ulines-1))) -1;
1185 ret_innerIndices[k] = (int)ceil ((((tempMinU-uMin)/(uMax - uMin)) * (n_ulines-1))) -1;
1189 #ifdef SHORTEN_GRID_LINE
1194 for(k=0, i=firstGridIndex; i>=lastGridIndex; i--, k++)
1198 Real a = grid->get_u_value(ret_indices[k]);
1199 Real b = grid->get_u_value(ret_indices[k]+1);
1200 assert(uintercBuf[k] > a && uintercBuf <= b);
1201 if( (uintercBuf[k]-a) <= 0.2 * (b-a))
1209 if(ret_innerIndices[k] > ret_indices[k-1])
1210 ret_innerIndices[k] = ret_indices[k-1];
1211 if(ret_innerIndices[k] > ret_indices[k])
1212 ret_innerIndices[k] = ret_indices[k];
1231 if(grid->get_n_ulines() == 2 ||
1232 grid->get_n_vlines() == 2)
1234 if(ulinear && grid->get_n_ulines() == 2)
1236 monoTriangulationFun(polygon, compV2InY, pStream);
1239 else if(DBG_isConvex(polygon) && polygon->numEdges() >=4)
1241 triangulateConvexPoly(polygon, ulinear, vlinear, pStream);
1244 else if(vlinear || DBG_is_U_direction(polygon))
1247 Int n_edges = polygon->numEdges();
1250 findInteriorCuspsX(polygon, n_cusps, cusps);
1255 monoTriangulationFun(polygon, compV2InX, pStream);
1260 else if(n_cusps == 1)
1265 directedLine* other = findDiagonal_singleCuspX( new_polygon);
1274 monoTriangulationFun(polygon, compV2InX, pStream);
1282 new_polygon->connectDiagonal_2slines(new_polygon, other,
1287 monoTriangulationFun(ret_p1, compV2InX, pStream);
1288 monoTriangulationFun(ret_p2, compV2InX, pStream);
1290 ret_p1->deleteSinglePolygonWithSline();
1291 ret_p2->deleteSinglePolygonWithSline();
1307 topV = botV = polygon;
1309 for(tempV = polygon->getNext(); tempV != polygon; tempV = tempV->getNext())
1311 if(compV2InY(topV->head(), tempV->head())<0) {
1315 if(compV2InY(botV->head(), tempV->head())>0) {
1326 firstGridIndex = (Int) ((topV->head()[1] - grid->get_v_min()) / (grid->get_v_max() - grid->get_v_min()) * (grid->get_n_vlines()-1));
1327 lastGridIndex = (Int) ((botV->head()[1] - grid->get_v_min()) / (grid->get_v_max() - grid->get_v_min()) * (grid->get_n_vlines()-1)) + 1;
1331 Int *leftGridIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
1332 assert(leftGridIndices);
1333 Int *rightGridIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
1334 assert(rightGridIndices);
1335 Int *leftGridInnerIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
1336 assert(leftGridInnerIndices);
1337 Int *rightGridInnerIndices = (Int*) malloc(
sizeof(Int) * (firstGridIndex - lastGridIndex +1));
1338 assert(rightGridInnerIndices);
1340 findLeftGridIndices(topV, firstGridIndex, lastGridIndex, grid, leftGridIndices, leftGridInnerIndices);
1342 findRightGridIndices(topV, firstGridIndex, lastGridIndex, grid, rightGridIndices, rightGridInnerIndices);
1344 gridBoundaryChain leftGridChain(grid, firstGridIndex, firstGridIndex-lastGridIndex+1, leftGridIndices, leftGridInnerIndices);
1346 gridBoundaryChain rightGridChain(grid, firstGridIndex, firstGridIndex-lastGridIndex+1, rightGridIndices, rightGridInnerIndices);
1362 for(i=1; i<=topV->get_npoints()-2; i++) {
1363 leftChain.appendVertex(topV->getVertex(i));
1365 for(tempV = topV->getNext(); tempV != botV; tempV = tempV->getNext())
1367 for(i=0; i<=tempV->get_npoints()-2; i++){
1368 leftChain.appendVertex(tempV->getVertex(i));
1373 for(tempV = topV->getPrev(); tempV != botV; tempV = tempV->getPrev())
1375 for(i=tempV->get_npoints()-2; i>=0; i--){
1376 rightChain.appendVertex(tempV->getVertex(i));
1379 for(i=botV->get_npoints()-2; i>=1; i--){
1380 rightChain.appendVertex(tempV->getVertex(i));
1383 sampleMonoPolyRec(topV->head(),
1397 free(leftGridIndices);
1398 free(rightGridIndices);
1399 free(leftGridInnerIndices);
1400 free(rightGridInnerIndices);
1403 void sampleMonoPolyRec(
1409 Int rightStartIndex,
1421 if(topVertex[1] <= botVertex[1])
1425 Int i=gridStartIndex;
1426 while (i < leftGridChain->get_nVlines())
1428 if(leftGridChain->get_v_value(i) < topVertex[1])
1438 int num_skipped_grid_lines=0;
1439 while(index1 < leftGridChain->get_nVlines())
1441 if(leftGridChain->getUlineIndex(index1) <= rightGridChain->getUlineIndex(index1))
1443 num_skipped_grid_lines++;
1449 if(index1 >= leftGridChain->get_nVlines())
1459 if(num_skipped_grid_lines <2)
1461 monoTriangulationRecGenOpt(topVertex, botVertex, leftChain, leftStartIndex,
1462 leftChain->getNumElements()-1,
1463 rightChain, rightStartIndex,
1464 rightChain->getNumElements()-1,
1471 monoTriangulationRec(topVertex, botVertex, leftChain, leftStartIndex,
1472 rightChain, rightStartIndex, pStream);
1493 if(index2 < leftGridChain->get_nVlines())
1494 while(leftGridChain->getInnerIndex(index2) <= rightGridChain->getInnerIndex(index2))
1497 if(index2 >= leftGridChain->get_nVlines())
1510 Int up_leftCornerWhere;
1511 Int up_leftCornerIndex;
1512 Int up_rightCornerWhere;
1513 Int up_rightCornerIndex;
1514 Int down_leftCornerWhere;
1515 Int down_leftCornerIndex;
1516 Int down_rightCornerWhere;
1517 Int down_rightCornerIndex;
1519 Real* tempBotVertex;
1520 Real* nextTopVertex=NULL;
1521 Int nextLeftStartIndex=0;
1522 Int nextRightStartIndex=0;
1525 Int botLeftIndex = leftChain->findIndexStrictBelowGen(
1526 leftGridChain->get_v_value(index2),
1528 leftChain->getNumElements()-1);
1529 Int botRightIndex = rightChain->findIndexStrictBelowGen(
1530 rightGridChain->get_v_value(index2),
1532 rightChain->getNumElements()-1);
1537 if(! findNeckF(leftChain, botLeftIndex, rightChain, botRightIndex,
1538 leftGridChain, rightGridChain, index2, neckLeftIndex, neckRightIndex))
1545 printf(
"neck NOT exists, botRightIndex=%i\n", botRightIndex);
1548 tempBotVertex = botVertex;
1549 nextTopVertex = botVertex;
1550 botLeftIndex = leftChain->getNumElements()-1;
1551 botRightIndex = rightChain->getNumElements()-1;
1556 printf(
"neck exists\n");
1566 printf(
"neck is found, neckLeftIndex=%i, neckRightIndex=%i\n", neckLeftIndex, neckRightIndex);
1568 glVertex2fv(leftChain->getVertex(neckLeftIndex));
1569 glVertex2fv(rightChain->getVertex(neckRightIndex));
1573 if(leftChain->getVertex(neckLeftIndex)[1] <= rightChain->getVertex(neckRightIndex)[1])
1575 tempBotVertex = leftChain->getVertex(neckLeftIndex);
1576 botLeftIndex = neckLeftIndex-1;
1577 botRightIndex = neckRightIndex;
1578 nextTopVertex = rightChain->getVertex(neckRightIndex);
1579 nextLeftStartIndex = neckLeftIndex;
1580 nextRightStartIndex = neckRightIndex+1;
1584 tempBotVertex = rightChain->getVertex(neckRightIndex);
1585 botLeftIndex = neckLeftIndex;
1586 botRightIndex = neckRightIndex-1;
1587 nextTopVertex = leftChain->getVertex(neckLeftIndex);
1588 nextLeftStartIndex = neckLeftIndex+1;
1589 nextRightStartIndex = neckRightIndex;
1593 findUpCorners(topVertex,
1595 leftStartIndex, botLeftIndex,
1597 rightStartIndex, botRightIndex,
1598 leftGridChain->get_v_value(index1),
1599 leftGridChain->get_u_value(index1),
1600 rightGridChain->get_u_value(index1),
1603 up_rightCornerWhere,
1604 up_rightCornerIndex);
1606 findDownCorners(tempBotVertex,
1608 leftStartIndex, botLeftIndex,
1610 rightStartIndex, botRightIndex,
1611 leftGridChain->get_v_value(index2),
1612 leftGridChain->get_u_value(index2),
1613 rightGridChain->get_u_value(index2),
1614 down_leftCornerWhere,
1615 down_leftCornerIndex,
1616 down_rightCornerWhere,
1617 down_rightCornerIndex);
1619 printf(
"find corners done, down_leftwhere=%i, down_righwhere=%i,\n",down_leftCornerWhere, down_rightCornerWhere );
1620 printf(
"find corners done, up_leftwhere=%i, up_righwhere=%i,\n",up_leftCornerWhere, up_rightCornerWhere );
1621 printf(
"find corners done, up_leftindex=%i, up_righindex=%i,\n",up_leftCornerIndex, up_rightCornerIndex );
1622 printf(
"find corners done, down_leftindex=%i, down_righindex=%i,\n",down_leftCornerIndex, down_rightCornerIndex );
1645 sampleConnectedComp(topVertex, tempBotVertex,
1647 leftStartIndex, botLeftIndex,
1649 rightStartIndex, botRightIndex,
1655 up_rightCornerWhere,
1656 up_rightCornerIndex,
1657 down_leftCornerWhere,
1658 down_leftCornerIndex,
1659 down_rightCornerWhere,
1660 down_rightCornerIndex,
1673 nextRightStartIndex,
1688 Int leftGridChainStartIndex,
1689 Int leftGridChainEndIndex,
1693 assert(leftChain->getVertex(topLeftIndex)[1] > leftGridChain->get_v_value(leftGridChainStartIndex));
1694 assert(leftChain->getVertex(topLeftIndex+1)[1] <= leftGridChain->get_v_value(leftGridChainStartIndex));
1695 assert(leftChain->getVertex(botLeftIndex)[1] <= leftGridChain->get_v_value(leftGridChainEndIndex));
1696 assert(leftChain->getVertex(botLeftIndex-1)[1] > leftGridChain->get_v_value(leftGridChainEndIndex));
1703 Real *upperVert, *lowerVert;
1704 upperVert = leftChain->getVertex(topLeftIndex);
1705 lowerVert = leftChain->getVertex(topLeftIndex+1);
1707 Int index = leftGridChainStartIndex;
1708 while(leftGridChain->get_v_value(index) >= lowerVert[1]){
1710 if(index > leftGridChainEndIndex)
1715 sampleLeftSingleTrimEdgeRegion(upperVert, lowerVert,
1717 leftGridChainStartIndex,
1720 sampleLeftStripRec(leftChain, topLeftIndex+1, botLeftIndex,
1721 leftGridChain, index, leftGridChainEndIndex,
1730 Int leftGridChainStartIndex,
1731 Int leftGridChainEndIndex,
1739 if(topLeftIndex >= botLeftIndex)
1748 Real secondGridChainV = leftGridChain->get_v_value(leftGridChainStartIndex+1);
1749 assert(leftGridChainStartIndex < leftGridChainEndIndex);
1750 Int index1 = topLeftIndex;
1751 while(leftChain->getVertex(index1)[1] > secondGridChainV)
1755 sampleLeftOneGridStep(leftChain, topLeftIndex, index1, leftGridChain, leftGridChainStartIndex, pStream);
1765 Real *uppervert, *lowervert;
1766 uppervert = leftChain->getVertex(index1);
1767 lowervert = leftChain->getVertex(index1+1);
1768 Int index2 = leftGridChainStartIndex+1;
1770 while(leftGridChain->get_v_value(index2) >= lowervert[1])
1773 if(index2 > leftGridChainEndIndex)
1777 sampleLeftSingleTrimEdgeRegion(uppervert, lowervert, leftGridChain, leftGridChainStartIndex+1, index2, pStream);
1788 sampleLeftStripRec(leftChain, index1+1, botLeftIndex, leftGridChain, index2, leftGridChainEndIndex, pStream);
1809 Int leftGridChainStartIndex,
1810 Int leftGridChainEndIndex,
1818 if(topLeftIndex > botLeftIndex)
1823 if(leftGridChainStartIndex>=leftGridChainEndIndex)
1827 assert(leftChain->getVertex(topLeftIndex)[1] <= leftGridChain->get_v_value(leftGridChainStartIndex) &&
1828 leftChain->getVertex(botLeftIndex)[1] >= leftGridChain->get_v_value(leftGridChainEndIndex));
1833 Real secondGridChainV = leftGridChain->get_v_value(leftGridChainStartIndex+1);
1836 Int index1 = topLeftIndex;
1838 while(leftChain->getVertex(index1)[1] > secondGridChainV){
1840 if(index1>botLeftIndex)
1849 if(index1>botLeftIndex)
1851 else if(leftChain->getVertex(index1)[1] < secondGridChainV)
1859 sampleLeftOneGridStep(leftChain, topLeftIndex, index1, leftGridChain, leftGridChainStartIndex, pStream);
1864 if(leftChain->getVertex(index1)[1] == secondGridChainV)
1867 sampleLeftStripRecF(leftChain, index1, botLeftIndex,leftGridChain, leftGridChainStartIndex+1, leftGridChainEndIndex, pStream);
1869 else if(index1 < botLeftIndex)
1879 Real *uppervert, *lowervert;
1880 uppervert = leftChain->getVertex(index1);
1881 lowervert = leftChain->getVertex(index1+1);
1882 Int index2 = leftGridChainStartIndex+1;
1885 while(leftGridChain->get_v_value(index2) >= lowervert[1])
1888 if(index2 > leftGridChainEndIndex)
1894 sampleLeftSingleTrimEdgeRegion(uppervert, lowervert, leftGridChain, leftGridChainStartIndex+1, index2, pStream);
1898 sampleLeftStripRecF(leftChain, index1+1, botLeftIndex, leftGridChain, index2, leftGridChainEndIndex, pStream);
1909 void sampleLeftSingleTrimEdgeRegion(Real upperVert[2], Real lowerVert[2],
1918 vArray.appendVertex(gridChain->get_vertex(beginIndex));
1920 for(k=1, i=beginIndex+1; i<=endIndex; i++, k++)
1922 vArray.appendVertex(gridChain->get_vertex(i));
1926 if(gridChain->getUlineIndex(i) < gridChain->getUlineIndex(i-1))
1929 pStream->insert(gridChain->get_vertex(i-1));
1930 for(j=gridChain->getUlineIndex(i); j<= gridChain->getUlineIndex(i-1); j++)
1931 pStream->insert(gridChain->getGrid()->get_u_value(j), gridChain->get_v_value(i));
1932 pStream->end(PRIMITIVE_STREAM_FAN);
1934 else if(gridChain->getUlineIndex(i) > gridChain->getUlineIndex(i-1))
1937 pStream->insert(gridChain->get_vertex(i));
1938 for(j=gridChain->getUlineIndex(i); j>= gridChain->getUlineIndex(i-1); j--)
1939 pStream->insert(gridChain->getGrid()->get_u_value(j), gridChain->get_v_value(i-1));
1940 pStream->end(PRIMITIVE_STREAM_FAN);
1945 monoTriangulation2(upperVert, lowerVert, &vArray, 0, endIndex-beginIndex,
1952 Int findIncreaseChainFromBegin(
vertexArray* chain, Int begin ,Int end)
1955 Real prevU = chain->getVertex(i)[0];
1957 for(i=begin+1; i<=end; i++){
1958 thisU = chain->getVertex(i)[0];
1973 Int checkMiddle(
vertexArray* chain, Int begin, Int end,
1974 Real vup, Real vbelow)
1977 for(i=begin; i<=end; i++)
1979 if(chain->getVertex(i)[1] < vup && chain->getVertex(i)[1]>vbelow)
1986 void sampleLeftOneGridStepNoMiddle(
vertexArray* leftChain,
1990 Int leftGridChainStartIndex,
1998 leftGridChain->leftEndFan(leftGridChainStartIndex+1, pStream);
2000 monoTriangulation2(leftGridChain->get_vertex(leftGridChainStartIndex),
2001 leftGridChain->get_vertex(leftGridChainStartIndex+1),
2013 void sampleLeftOneGridStep(
vertexArray* leftChain,
2017 Int leftGridChainStartIndex,
2021 if(checkMiddle(leftChain, beginLeftIndex, endLeftIndex,
2022 leftGridChain->get_v_value(leftGridChainStartIndex),
2023 leftGridChain->get_v_value(leftGridChainStartIndex+1))<0)
2027 sampleLeftOneGridStepNoMiddle(leftChain, beginLeftIndex, endLeftIndex, leftGridChain, leftGridChainStartIndex, pStream);
2036 gridWrap* grid = leftGridChain->getGrid();
2041 Int innerInd = leftGridChain->getInnerIndex(leftGridChainStartIndex+1);
2042 Int upperInd = leftGridChain->getUlineIndex(leftGridChainStartIndex);
2043 Int lowerInd = leftGridChain->getUlineIndex(leftGridChainStartIndex+1);
2044 Real upperV = leftGridChain->get_v_value(leftGridChainStartIndex);
2045 Real lowerV = leftGridChain->get_v_value(leftGridChainStartIndex+1);
2048 vert1[1] = vert2[1] = upperV;
2049 for(i=innerInd; i>upperInd; i--)
2051 vert1[0]=grid->get_u_value(i);
2052 vert2[0]=grid->get_u_value(i-1);
2058 poly->insert(dline);
2062 vert1[0] = grid->get_u_value(upperInd);
2064 sline =
new sampledLine(vert1, leftChain->getVertex(beginLeftIndex));
2069 poly->insert(dline);
2072 for(i=beginLeftIndex; i<endLeftIndex; i++)
2074 sline =
new sampledLine(leftChain->getVertex(i), leftChain->getVertex(i+1));
2076 poly->insert(dline);
2080 vert2[0] = grid->get_u_value(lowerInd);
2082 sline =
new sampledLine(leftChain->getVertex(endLeftIndex), vert2);
2084 poly->insert(dline);
2087 vert1[1] = vert2[1] = lowerV;
2088 for(i=lowerInd; i<innerInd; i++)
2090 vert1[0] = grid->get_u_value(i);
2091 vert2[0] = grid->get_u_value(i+1);
2094 poly->insert(dline);
2098 vert1[0]=vert2[0] = grid->get_u_value(innerInd);
2103 poly->insert(dline);
2104 monoTriangulationOpt(poly, pStream);
2106 poly->deleteSinglePolygonWithSline();
2123 Real prevU = leftChain->getVertex(i)[0];
2124 for(i=endLeftIndex-1; i>=beginLeftIndex; i--){
2125 Real thisU = leftChain->getVertex(i)[0];
2137 if(i+1 == endLeftIndex && leftChain->getVertex(endLeftIndex)[1] == leftGridChain->get_v_value(1+leftGridChainStartIndex))
2140 Int j = beginLeftIndex+1;
2143 if(leftGridChain->getInnerIndex(leftGridChainStartIndex+1) > leftGridChain->getUlineIndex(leftGridChainStartIndex))
2145 j = findIncreaseChainFromBegin(leftChain, beginLeftIndex, i+1);
2147 Int temp = beginLeftIndex;
2152 if(j-1 == beginLeftIndex)
2154 while(leftChain->getVertex(j-1)[1] == leftGridChain->get_v_value(leftGridChainStartIndex))
2158 vert[0] = leftGridChain->get_u_value(leftGridChainStartIndex);
2159 vert[1] = leftGridChain->get_v_value(leftGridChainStartIndex);
2163 leftChain->getVertex(j-1),
2174 stripOfFanLeft(leftChain, j-1, temp, leftGridChain->getGrid(),
2175 leftGridChain->getVlineIndex(leftGridChainStartIndex),
2176 leftGridChain->getUlineIndex(leftGridChainStartIndex),
2177 leftGridChain->getInnerIndex(leftGridChainStartIndex+1),
2183 stripOfFanLeft(leftChain, endLeftIndex, i+1, leftGridChain->getGrid(),
2184 leftGridChain->getVlineIndex(leftGridChainStartIndex+1),
2185 leftGridChain->getUlineIndex(leftGridChainStartIndex+1),
2186 leftGridChain->getInnerIndex(leftGridChainStartIndex+1),
2195 vert[0][0]=vert[1][0] = leftGridChain->getInner_u_value(leftGridChainStartIndex+1);
2196 vert[0][1] = leftGridChain->get_v_value(leftGridChainStartIndex);
2197 vert[1][1] = leftGridChain->get_v_value(leftGridChainStartIndex+1);
2215 Real prevU = leftChain->getVertex(i)[0];
2216 for(i=beginLeftIndex+1; i<=endLeftIndex; i++){
2217 Real thisU = leftChain->getVertex(i)[0];
2228 stripOfFanLeft(leftChain, i-1, beginLeftIndex, leftGridChain->getGrid(),
2229 leftGridChain->getVlineIndex(leftGridChainStartIndex),
2230 leftGridChain->getUlineIndex(leftGridChainStartIndex),
2231 leftGridChain->getUlineIndex(leftGridChainStartIndex+1),
2239 vert[0][0]=vert[1][0] = leftGridChain->get_u_value(leftGridChainStartIndex+1);
2240 vert[0][1] = leftGridChain->get_v_value(leftGridChainStartIndex);
2241 vert[1][1] = leftGridChain->get_v_value(leftGridChainStartIndex+1);
2260 void triangulateXYMono(Int n_upper, Real upperVerts[][2],
2261 Int n_lower, Real lowerVerts[][2],
2267 assert(n_upper>=1 && n_lower>=1);
2268 if(upperVerts[0][0] <= lowerVerts[0][0])
2272 leftMostV = upperVerts[0];
2278 leftMostV = lowerVerts[0];
2289 pStream->insert(leftMostV);
2291 pStream->insert(lowerVerts[j]);
2294 pStream->end(PRIMITIVE_STREAM_FAN);
2299 else if(j>= n_lower)
2305 pStream->insert(leftMostV);
2307 for(k=n_upper-1; k>=i; k--)
2308 pStream->insert(upperVerts[k]);
2310 pStream->end(PRIMITIVE_STREAM_FAN);
2318 if(upperVerts[i][0] <= lowerVerts[j][0])
2321 pStream->insert(lowerVerts[j]);
2329 if(upperVerts[k][0] > lowerVerts[j][0])
2336 pStream->insert(upperVerts[l]);
2338 pStream->insert(leftMostV);
2340 pStream->end(PRIMITIVE_STREAM_FAN);
2343 leftMostV = upperVerts[k];
2349 pStream->insert(upperVerts[i]);
2350 pStream->insert(leftMostV);
2356 if(lowerVerts[k][0] >= upperVerts[i][0])
2358 pStream->insert(lowerVerts[k]);
2361 pStream->end(PRIMITIVE_STREAM_FAN);
2363 leftMostV = lowerVerts[j-1];
2375 Int ulineSmallIndex,
2376 Int ulineLargeIndex,
2381 assert(largeIndex >= smallIndex);
2384 grid_v_value = grid->get_v_value(vlineIndex);
2386 Real2* trimVerts=(Real2*) malloc(
sizeof(Real2)* (largeIndex-smallIndex+1));
2390 Real2* gridVerts=(Real2*) malloc(
sizeof(Real2)* (ulineLargeIndex-ulineSmallIndex+1));
2395 for(k=0, i=smallIndex; i<=largeIndex; i++, k++)
2397 trimVerts[k][0] = leftChain->getVertex(i)[0];
2398 trimVerts[k][1] = leftChain->getVertex(i)[1];
2401 for(k=0, i=largeIndex; i>=smallIndex; i--, k++)
2403 trimVerts[k][0] = leftChain->getVertex(i)[0];
2404 trimVerts[k][1] = leftChain->getVertex(i)[1];
2407 for(k=0, i=ulineSmallIndex; i<= ulineLargeIndex; i++, k++)
2409 gridVerts[k][0] = grid->get_u_value(i);
2410 gridVerts[k][1] = grid_v_value;
2415 ulineLargeIndex-ulineSmallIndex+1, gridVerts,
2416 largeIndex-smallIndex+1, trimVerts,
2419 triangulateXYMono(largeIndex-smallIndex+1, trimVerts,
2420 ulineLargeIndex-ulineSmallIndex+1, gridVerts,