00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "corefine-2d-tools.hh"
00025 #include "bounding-box.hh"
00026
00027
00028
00029 #include "message-macros.hh"
00030
00031 using namespace std;
00032 using namespace GMap3d;
00033
00034
00035
00036 #define PROD(V1, V2) ((V1).getX() * (V2).getY() - (V1).getY() * (V2).getX())
00037
00038 #define a0 FMap->alpha0
00039 #define a1 FMap->alpha1
00040 #define a2 FMap->alpha2
00041 #define a3 FMap->alpha3
00042
00043 #define VTX(d) (AVertexDI < 0 ? FMap->findVertex(d) : \
00044 (CAttributeVertex*)FMap->getDirectInfo(d, AVertexDI))
00045
00046
00047
00048 CCorefine2dTools::CCorefine2dTools(CGMapVertex * AMap, TCoordinate AEpsilon)
00049 : CGeneralTools(AMap,AEpsilon)
00050 {
00051 }
00052
00053
00054
00055 bool CCorefine2dTools::isVectorInSector(const CVertex & AVector,
00056 const CVertex & ASectorVector1,
00057 const CVertex & ASectorVector2)
00058 {
00059 if (PROD(ASectorVector1, ASectorVector2) < 0.0)
00060 return (PROD(ASectorVector1, AVector) >= 0 ||
00061 PROD(ASectorVector2, AVector) <= 0);
00062
00063 return (PROD(ASectorVector1, AVector) >= 0 &&
00064 PROD(ASectorVector2, AVector) <= 0);
00065 }
00066
00067
00068
00069 bool CCorefine2dTools::isVectorInSector(const CVertex & AVector,
00070 CDart * ASector, int AVertexDI)
00071 {
00072 CVertex center = *VTX(ASector);
00073
00074 CVertex v1 = *VTX(FMap->alpha0(ASector)) - center;
00075 CVertex v2 = *VTX(FMap->alpha0(FMap->alpha1(ASector))) - center;
00076
00077 return isVectorInSector(AVector, v1, v2);
00078 }
00079
00080
00081
00082 bool CCorefine2dTools::areVectorsColinear(const CVertex & AVector1,
00083 const CVertex & AVector2)
00084 {
00085
00086
00087
00088
00089
00090 CVertex v1 = normalizeVector(AVector1);
00091 CVertex v2 = normalizeVector(AVector2);
00092
00093 assert(v1 != ORIGIN);
00094 assert(v2 != ORIGIN);
00095
00096 return arePointsEqual(v1, v2);
00097 }
00098
00099
00100
00101 TCoordinate CCorefine2dTools::pointParameterOnLine(const CVertex & APoint,
00102 const CVertex & ALineVertex1,
00103 const CVertex & ALineVertex2)
00104 {
00105 TCoordinate res;
00106 CVertex v = ALineVertex2 - ALineVertex1;
00107
00108 #ifdef WARNING_MESSAGES
00109 if (isVectorNull(v))
00110 WARN_BB("<CGeneralTools::pointParameterOnLine> "
00111 << "Le vecteur est de longueur nulle : " << v);
00112 #endif
00113
00114 if (fabs(v.getX()) > fabs(v.getY()))
00115 res = (APoint.getX() - ALineVertex1.getX()) / v.getX();
00116 else
00117 res = (APoint.getY() - ALineVertex1.getY()) / v.getY();
00118
00119 return res;
00120 }
00121
00122
00123
00124 CDart * CCorefine2dTools::findSectorOfVector(const CVertex & AVector,
00125 CDart * AVertex, int AVertexDI)
00126 {
00127 CDart *d = AVertex;
00128
00129 if (a1(d) != a2(d))
00130 while (!isVectorInSector(AVector, d, AVertexDI))
00131 d = a2(a1(d));
00132
00133 return d;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 list<CDart*> * CCorefine2dTools::sortVerticesEdges(CDart * AVertex1,
00180 CDart * AVertex2,
00181 int AVertexDI)
00182 {
00183 DEBUG_FUNCTION;
00184
00185 CDart *d;
00186 list<CDart*> * l = new list<CDart*>;
00187 list<CDart*>::iterator it;
00188
00189
00190 if (a1(AVertex1) == a2(AVertex1)) {
00191 l->push_back(AVertex1);
00192 AVertex2 = a2(a1(findSectorOfVector(edgeVector(AVertex1, AVertexDI),
00193 AVertex2, AVertexDI)));
00194
00195 d = AVertex2;
00196 do {
00197 l->push_back(d);
00198 d = a2(a1(d));
00199 }
00200 while (d != AVertex2);
00201 }
00202
00203 else if (a1(AVertex2) == a2(AVertex2)) {
00204 l->push_back(AVertex2);
00205 AVertex1 = a2(a1(findSectorOfVector(edgeVector(AVertex2, AVertexDI),
00206 AVertex1, AVertexDI)));
00207
00208 d = AVertex1;
00209 do {
00210 l->push_back(d);
00211 d = a2(a1(d));
00212 }
00213 while (d != AVertex1);
00214 }
00215
00216 else {
00217 int mark = FMap->getNewMark();
00218 CVertex center = *VTX(AVertex1);
00219
00220 d = AVertex1;
00221 CVertex v = *VTX(a0(d)) - center;
00222
00223 AVertex2 = findSectorOfVector(v, AVertex2, AVertexDI);
00224
00225 CDart *d1 = a2(a1(AVertex1));
00226 CDart *d2 = a2(a1(AVertex2));
00227
00228 CVertex v1 = *VTX(a0(d1)) - center;
00229 CVertex v2 = *VTX(a0(d2)) - center;
00230
00231 #define INSERT(dart) (l->push_back(dart), FMap->setMark(dart, mark))
00232
00233 do {
00234 INSERT(d);
00235
00236 bool test1 = isVectorInSector(v1, v, v2);
00237 bool test2 = isVectorInSector(v2, v, v1);
00238
00239 MSG("v = " << center << " --> " << center + v);
00240 MSG("v1 = " << center << " --> " << center + v1);
00241 MSG("v2 = " << center << " --> " << center + v2);
00242
00243 MSG("tests :");
00244 MSG("v1 entre v et v2 : " << test1);
00245 MSG("v2 entre v et v1 : " << test2);
00246
00247 if (areVectorsColinear(v, v2)) {
00248 MSG("v et v2 sont colinéaires");
00249 d = d2;
00250 v = v2;
00251 d2 = a2(a1(d2));
00252 v2 = *VTX(a0(d2)) - center;
00253 }
00254 else if (areVectorsColinear(v1, v2)) {
00255
00256 MSG("v1 et v2 sont colinéaires");
00257
00258 d = d1;
00259 v = v1;
00260
00261 if (!FMap->isMarked(d2, mark)) {
00262 INSERT(d2);
00263 }
00264
00265 d2 = a2(a1(d2));
00266 d1 = a2(a1(d1));
00267
00268 v1 = *VTX(a0(d1)) - center;
00269 v2 = *VTX(a0(d2)) - center;
00270 }
00271 else if (test1 && !test2) {
00272 MSG("v1 est entre v et v2");
00273
00274 d = d1;
00275 v = v1;
00276 d1 = a2(a1(d1));
00277 v1 = *VTX(a0(d1)) - center;
00278 }
00279 else if (!test1 && test2) {
00280 MSG("v2 est entre v et v1");
00281
00282 d = d2;
00283 v = v2;
00284 d2 = a2(a1(d2));
00285 v2 = *VTX(a0(d2)) - center;
00286 }
00287 else {
00288 assert(test1 != test2);
00289 }
00290 }
00291 while (!FMap->isMarked(d, mark));
00292
00293 #undef INSERT
00294
00295 bool problem = false;
00296
00297
00298 d2 = AVertex2;
00299 do {
00300 if (FMap->isMarked(d2, mark))
00301 FMap->unsetMark(d2, mark);
00302 else {
00303 WARN_BR("<CCorefine2dTools::sortVerticesEdges> "
00304 << "Brin du deuxième sommet non marqué !");
00305 problem = true;
00306 }
00307
00308 d2 = a2(a1(d2));
00309 }
00310 while (d2 != AVertex2);
00311
00312
00313 d1 = AVertex1;
00314 do {
00315 if (FMap->isMarked(d1, mark))
00316 FMap->unsetMark(d1, mark);
00317 else {
00318 WARN_BR("<CCorefine2dTools::sortVerticesEdges> "
00319 << "Brin du premier sommet non marqué !");
00320 problem = true;
00321 }
00322
00323 d1 = a2(a1(d1));
00324 }
00325 while (d1 != AVertex1);
00326
00327 FMap->freeMark(mark);
00328
00329 if (problem) {
00330 cout << "\033[0;33m"
00331 << "Tri angulaire autour du sommet " << center << endl;
00332 for (it = l->begin() ; it != l->end() ; it++) {
00333 cout << *VTX(a0(*it)) << endl;
00334 }
00335 cout << "\033[0m";
00336
00337 delete l;
00338 l = NULL;
00339 }
00340 }
00341
00342 return l;
00343 }
00344
00345
00346
00347 list<CDart*> *
00348 CCorefine2dTools::sortMultipleVerticesEdges(CDart * AVertex1,
00349 const list<CDart*> & AVertices,
00350 int AVertexDI)
00351 {
00352 int mark = FMap->getNewMark();
00353 list<CDart*> * l = new list<CDart*>;
00354 list<CDart*>::const_iterator it;
00355 int size = AVertices.size();
00356 CDart **darts = new CDart*[size];
00357 CDart **tmp_darts = new CDart*[size];
00358 CVertex *vectors = new CVertex[size];
00359 int i = 0, j;
00360
00361 CVertex center = *VTX(AVertex1);
00362
00363 CDart *d = AVertex1;
00364 CVertex v = *VTX(a0(d)) - center;
00365
00366 CDart *d1 = a2(a1(AVertex1));
00367 CVertex v1 = *VTX(a0(d1)) - center;
00368
00369 for (it = AVertices.begin() ; it != AVertices.end() ; it++) {
00370 darts[i] = findSectorOfVector(v, *it, AVertexDI);
00371 tmp_darts[i] = a2(a1(darts[i]));
00372 vectors[i] = *VTX(a0(tmp_darts[i])) - center;
00373 i++;
00374 }
00375
00376 #define INSERT(dart) (l->push_back(dart), FMap->setMark(dart, mark))
00377
00378 do {
00379 INSERT(d);
00380
00381 j = 0;
00382
00383
00384 for (i = 1 ; i < size ; i++)
00385 if (isVectorInSector(vectors[i], v, vectors[j]))
00386 j = i;
00387
00388 if (areVectorsColinear(v1, vectors[j])) {
00389 d = d1;
00390 v = v1;
00391
00392 for (i = 0 ; i < size ; i++)
00393 if (areVectorsColinear(vectors[i], v1)) {
00394 if(!FMap->isMarked(tmp_darts[i], mark)) {
00395 INSERT(tmp_darts[i]);
00396 }
00397
00398 tmp_darts[i] = a2(a1(tmp_darts[i]));
00399 vectors[i] = *VTX(a0(tmp_darts[i])) - center;
00400 }
00401
00402 d1 = a2(a1(d1));
00403 v1 = *VTX(a0(d1)) - center;
00404 }
00405 else if (isVectorInSector(vectors[j], v, v1)) {
00406 d = tmp_darts[j];
00407 v = vectors[j];
00408
00409 for (i = 0 ; i < size ; i++)
00410 if (i != j && areVectorsColinear(vectors[i], v)) {
00411 if(!FMap->isMarked(tmp_darts[i], mark)) {
00412 INSERT(tmp_darts[i]);
00413 }
00414
00415 tmp_darts[i] = a2(a1(tmp_darts[i]));
00416 vectors[i] = *VTX(a0(tmp_darts[i])) - center;
00417 }
00418
00419 tmp_darts[j] = a2(a1(tmp_darts[j]));
00420 vectors[j] = *VTX(a0(tmp_darts[j])) - center;
00421 }
00422 else {
00423 d = d1;
00424 v = v1;
00425 d1 = a2(a1(d1));
00426 v1 = *VTX(a0(d1)) - center;
00427 }
00428 }
00429 while ( !FMap->isMarked(d, mark));
00430
00431 #undef INSERT
00432
00433 bool problem = false;
00434
00435
00436 for (i = 0 ; i < size ; i++) {
00437 tmp_darts[i] = darts[i];
00438
00439 do {
00440 if (FMap->isMarked(tmp_darts[i], mark))
00441 FMap->unsetMark(tmp_darts[i], mark);
00442 else {
00443 WARN_BR("<CCorefine2dTools::sortMultipleVerticesEdges> "
00444 << "Brin du sommet n°" << i << " non marqué !");
00445 problem = true;
00446 }
00447
00448 tmp_darts[i] = a2(a1(tmp_darts[i]));
00449 }
00450 while (tmp_darts[i] != darts[i]);
00451 }
00452
00453
00454 d1 = AVertex1;
00455 do {
00456 if (FMap->isMarked(d1, mark))
00457 FMap->unsetMark(d1, mark);
00458 else {
00459 WARN_BR("<CCorefine2dTools::sortMultipleVerticesEdges> "
00460 << "Brin du premier sommet non marqué !");
00461 problem = true;
00462 }
00463
00464 d1 = a2(a1(d1));
00465 }
00466 while (d1 != AVertex1);
00467
00468 FMap->freeMark(mark);
00469
00470 delete [] darts;
00471 delete [] tmp_darts;
00472 delete [] vectors;
00473
00474 if (problem) {
00475 #ifdef WARNING_MESSAGES
00476 cout << "\033[1;34m" << "Tri angulaire autour du sommet " << center << endl;
00477 for (it = l->begin() ; it != l->end() ; it++)
00478 cout << *VTX(a0(*it)) << endl;
00479 cout << "\033[0m";
00480 #endif
00481
00482 delete l;
00483
00484 return NULL;
00485 }
00486
00487 return l;
00488 }
00489
00490
00491
00492 CDart * CCorefine2dTools::findWellOrientedDart(CDart * AVertex, int AVertexDI)
00493 {
00494 CVertex v1, v2;
00495
00496 v1 = faceNormalVector(AVertex, AVertexDI);
00497 v2 = faceNormalVector(a2(AVertex), AVertexDI);
00498
00499 if ((v1.getZ() < 0.0 && v2.getZ() < 0.0) ||
00500 (v1.getZ() > 0.0 && v2.getZ() > 0.0)) {
00501
00502
00503
00504 CBoundingBox bb1, bb2;
00505
00506 bb1 = orbitBoundingBox(AVertex, ORBIT_FACE, AVertexDI);
00507 bb2 = orbitBoundingBox(a2(AVertex), ORBIT_FACE, AVertexDI);
00508
00509 if (bb1.getSurface() <= bb2.getSurface()) {
00510
00511 if (v1.getZ() < 0.0) {
00512 AVertex = a1(AVertex);
00513 }
00514 }
00515 else {
00516
00517 if (v1.getZ() > 0.0) {
00518 AVertex = a1(AVertex);
00519 }
00520 }
00521 }
00522 else if (v1.getZ() < 0.0) {
00523 AVertex = a1(AVertex);
00524 }
00525
00526 return AVertex;
00527 }
00528
00529
00530
00531 TPositionOnEdge
00532 CCorefine2dTools::localizePointOnEdge(const CVertex & APoint,
00533 const CVertex & AVertex1,
00534 const CVertex & AVertex2,
00535 TCoordinate * AParam)
00536 {
00537 assert(AParam != NULL);
00538
00539 if (arePointsEqual(APoint, AVertex2)) {
00540 *AParam = 1.0;
00541 return EP_OnSecondVertex;
00542 }
00543
00544 if (arePointsEqual(APoint, AVertex1)) {
00545 *AParam = 0.0;
00546 return EP_OnFirstVertex;
00547 }
00548
00549 if (isPointOnLine(APoint, AVertex1, AVertex2)) {
00550 *AParam = pointParameterOnLine(APoint, AVertex1, AVertex2);
00551
00552 if (*AParam >= 0.0 && *AParam <= 1.0)
00553 return EP_OnEdge;
00554 }
00555
00556 return EP_OutOfEdge;
00557 }
00558
00559
00560
00561 TPositionOnEdge
00562 CCorefine2dTools::localizeEdgesIntersection(const CVertex & ALinePoint1,
00563 const CVertex & ALinePoint2,
00564 const CVertex & AEdgePoint1,
00565 const CVertex & AEdgePoint2,
00566 TCoordinate * ALineParam,
00567 TCoordinate * AEdgeParam)
00568 {
00569 assert(AEdgeParam != NULL && ALineParam != NULL);
00570
00571 if (localizePointOnEdge(AEdgePoint2, ALinePoint1,
00572 ALinePoint2, ALineParam) != EP_OutOfEdge) {
00573
00574 *AEdgeParam = 1.0;
00575 return EP_OnSecondVertex;
00576 }
00577
00578 if (localizePointOnEdge(AEdgePoint1, ALinePoint1,
00579 ALinePoint2, ALineParam) != EP_OutOfEdge) {
00580 *AEdgeParam = 0.0;
00581 return EP_OnFirstVertex;
00582 }
00583
00584 CVertex v[2] = {ALinePoint2 - ALinePoint1, AEdgePoint2 - AEdgePoint1};
00585 TCoordinate d = v[0].getY() * v[1].getX() - v[0].getX() * v[1].getY();
00586
00587 #ifdef WARNING_MESSAGES
00588 if (isVectorNull(v[0]) || isVectorNull(v[1]))
00589 WARN_BB("<localizeEdgesIntersection>"
00590 << "Une des arêtes est de longueur nulle !");
00591 #endif
00592
00593 if (d == 0.0)
00594 return EP_OutOfEdge;
00595
00596 *ALineParam = (v[1].getY() * (ALinePoint1.getX() - AEdgePoint1.getX()) -
00597 v[1].getX() * (ALinePoint1.getY() - AEdgePoint1.getY())) / d;
00598
00599 if (fabs(v[1].getX()) > fabs(v[1].getY()))
00600 *AEdgeParam = (ALinePoint1.getX() + *ALineParam * v[0].getX() -
00601 AEdgePoint1.getX()) / v[1].getX();
00602 else
00603 *AEdgeParam = (ALinePoint1.getY() + *ALineParam * v[0].getY() -
00604 AEdgePoint1.getY()) / v[1].getY();
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614 if (*AEdgeParam >= 0.0 && *AEdgeParam <= 1.0)
00615 return EP_OnEdge;
00616
00617 return EP_OutOfEdge;
00618 }
00619
00620
00621
00622 CEdgeIntersection
00623 CCorefine2dTools::findNearestIntersection(const CVertex & AVertex1,
00624 const CVertex & AVertex2,
00625 CDart * AFace,
00626 bool AFaceIsVertex1,
00627 int AVertexDI)
00628 {
00629 CDart *d = AFace;
00630 CEdgeIntersection inter;
00631 int edge_mark = FMap->getNewMark();
00632 TPositionOnEdge pos;
00633 TCoordinate t1 = 0.0, t2 = 0.0, best_t2 = 1.0;
00634 CVertex *pt1, *pt2;
00635
00636
00637 if (AVertex1 == AVertex2) {
00638 FMap->freeMark(edge_mark);
00639 return inter;
00640 }
00641
00642
00643 do {
00644 pos = localizePointOnEdge(*VTX(d), AVertex1, AVertex2, &t2);
00645
00646 if ((pos == EP_OnEdge && t2 < best_t2) ||
00647 (pos == EP_OnSecondVertex && t2 <= best_t2) ||
00648 (pos == EP_OnFirstVertex && AFaceIsVertex1 && d != AFace) ||
00649 (pos == EP_OnFirstVertex && !AFaceIsVertex1)) {
00650 inter.setCell(d);
00651 inter.setCellDimension(0);
00652 inter.setPosition(pos);
00653
00654 best_t2 = t2;
00655
00656 FMap->setMark(d, edge_mark);
00657 FMap->setMark(a0(d), edge_mark);
00658 FMap->setMark(a1(d), edge_mark);
00659 FMap->setMark(a0(a1(d)), edge_mark);
00660 }
00661
00662 d = a1(a0(d));
00663 }
00664 while (d != AFace);
00665
00666
00667 do {
00668 pt1 = VTX(d);
00669 pt2 = VTX(a0(d));
00670
00671 if (FMap->isMarked(d, edge_mark)) {
00672 FMap->unsetMark(d, edge_mark);
00673 FMap->unsetMark(a0(d), edge_mark);
00674 }
00675 else if (fabs((*pt2 - *pt1).norm()) > FEps / 2.0) {
00676 pos = localizeEdgesIntersection(*pt1, *pt2, AVertex1, AVertex2, &t1, &t2);
00677
00678 if ((t1 >= 0.0 && t1 <= 1.0) &&
00679 ((pos == EP_OnEdge && t2 < best_t2) ||
00680 (pos == EP_OnSecondVertex && t2 <= best_t2) ||
00681 (pos == EP_OnFirstVertex && AFaceIsVertex1 &&
00682 d != AFace && d != a0(a1(AFace))) ||
00683 (pos == EP_OnFirstVertex && !AFaceIsVertex1))) {
00684 inter.setCell(d);
00685 inter.setCellDimension(1);
00686 inter.setPosition(pos);
00687
00688 best_t2 = t2;
00689 }
00690 }
00691
00692 d = a1(a0(d));
00693 }
00694 while (d != AFace);
00695
00696 FMap->freeMark(edge_mark);
00697
00698 if (inter.getCell() != NULL)
00699 inter.setPoint(AVertex1 + best_t2 * (AVertex2 - AVertex1));
00700
00701 return inter;
00702 }
00703
00704
00705
00706 CDart * CCorefine2dTools::localizePointInMesh(const CVertex & APoint,
00707 CDart * AMesh, int AVertexDI)
00708 {
00709 CDart *face = NULL;
00710 CEdgeIntersection inter;
00711 CVertex pt;
00712
00713 inter.setCell(AMesh);
00714 inter.setCellDimension(0);
00715
00716 do {
00717 switch (inter.getCellDimension()) {
00718 case 0:
00719 pt = *VTX(inter.getCell());
00720 face = findSectorOfVector(APoint - pt, inter.getCell(), AVertexDI);
00721 break;
00722
00723 case 1:
00724 pt = inter.getPoint();
00725 face = a2(a0(inter.getCell()));
00726
00727 break;
00728
00729 default:
00730 break;
00731 }
00732
00733
00734
00735 inter = findNearestIntersection(pt, APoint, face, true, AVertexDI);
00736 }
00737 while (inter.getCell() != NULL);
00738
00739 return face;
00740 }
00741
00742
00743
00744 void CCorefine2dTools::removeDoubleEdges(CDart *& AMesh1, CDart *& AMesh2, bitset<NB_MARKS> ACopyMarks, int AVertexDI)
00745 {
00746 CDart *d, *to_link[4], *edge[4], *to_remove[4];
00747 int remove_mark = FMap->getNewMark();
00748 CVertex pt1, pt2;
00749
00750 for (CStaticCoverageCC scc(FMap, AMesh1) ; scc.cont() ; scc++) {
00751 d = *scc;
00752
00753 if (!FMap->isMarked(a1(d), remove_mark)) {
00754 if (a1(a0(d)) == a0(a1(d)) || a0(a2(a1(d))) == a1(a2(a0(d)))) {
00755 edge[0] = d;
00756 edge[1] = a0(edge[0]);
00757 edge[2] = a2(edge[1]);
00758 edge[3] = a0(edge[2]);
00759
00760 to_remove[0] = a2(a1(d));
00761 to_remove[1] = a0(to_remove[0]);
00762 to_remove[2] = a2(to_remove[1]);
00763 to_remove[3] = a0(to_remove[2]);
00764
00765 if (a1(a0(d)) == a0(a1(d))) {
00766 to_link[0] = d;
00767 to_link[1] = a0(d);
00768 to_link[2] = a1(to_remove[0]);
00769 to_link[3] = a1(to_remove[1]);
00770 }
00771 else {
00772 to_link[0] = d;
00773 to_link[1] = a0(a2(d));
00774 to_link[2] = a1(to_remove[0]);
00775 to_link[3] = a1(to_remove[2]);
00776 }
00777
00778 for (int i=0 ; i<4 ; i++) {
00779 if (!FMap->isFree1(to_link[i]))
00780 FMap->dartUnsew1(to_link[i]);
00781
00782 FMap->setMark(to_remove[i], remove_mark);
00783
00784 if (AMesh1 == to_remove[i])
00785 AMesh1 = edge[i];
00786 if (AMesh2 == to_remove[i])
00787 AMesh2 = edge[i];
00788
00789 for (int j = 0; j < NB_MARKS; j++)
00790 if (ACopyMarks[j] && FMap->isMarked(to_remove[i], j))
00791 FMap->setMark(edge[i], j);
00792 }
00793
00794 FMap->dartSew1(to_link[0], to_link[2]);
00795 FMap->dartSew1(to_link[1], to_link[3]);
00796
00797 if (AVertexDI >= 0) {
00798 FMap->pointDirectInfoToAttributeVertex(AVertexDI, to_link[0]);
00799 FMap->pointDirectInfoToAttributeVertex(AVertexDI, to_link[1]);
00800 }
00801 }
00802 }
00803 }
00804
00805 FMap->deleteMarkedDarts(remove_mark);
00806
00807 FMap->freeMark(remove_mark);
00808 }
00809
00810