00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "dart.hh"
00026 #include "embedding.hh"
00027 #include "dynamic-coverage.hh"
00028 #include "static-coverage.hh"
00029 #include <cassert>
00030
00031 namespace GMap3d
00032 {
00033
00034 INLINE
00035 CGMap::CGMap()
00036 : CGMapBasic()
00037 {
00038 }
00039
00040 INLINE
00041 CCoverage* CGMap::getDynamicCoverage(const CDart* ADart, TOrbit AOrbit)
00042 {
00043 switch (AOrbit)
00044 {
00045 case ORBIT_SELF: return new CDynamicCoverageSelf (this,ADart );
00046 case ORBIT_0: return new CDynamicCoverage0 (this,ADart );
00047 case ORBIT_1: return new CDynamicCoverage1 (this,ADart );
00048 case ORBIT_01: return new CDynamicCoverage01 (this,ADart );
00049 case ORBIT_2: return new CDynamicCoverage2 (this,ADart );
00050 case ORBIT_02: return new CDynamicCoverage02 (this,ADart );
00051 case ORBIT_12: return new CDynamicCoverage12 (this,ADart );
00052 case ORBIT_012: return new CDynamicCoverage012 (this,ADart );
00053 case ORBIT_3: return new CDynamicCoverage3 (this,ADart );
00054 case ORBIT_03: return new CDynamicCoverage03 (this,ADart );
00055 case ORBIT_13: return new CDynamicCoverage13 (this,ADart );
00056 case ORBIT_013: return new CDynamicCoverage013 (this,ADart );
00057 case ORBIT_23: return new CDynamicCoverage23 (this,ADart );
00058 case ORBIT_023: return new CDynamicCoverage023 (this,ADart );
00059 case ORBIT_123: return new CDynamicCoverage123 (this,ADart );
00060 case ORBIT_0123: return new CDynamicCoverage0123 (this,ADart );
00061 case ORBIT_BORDER_0: return new CDynamicBorderCoverage(this,ADart,0);
00062 case ORBIT_BORDER_1: return new CDynamicBorderCoverage(this,ADart,1);
00063 case ORBIT_BORDER_2: return new CDynamicBorderCoverage(this,ADart,2);
00064 case ORBIT_BORDER_3: return new CDynamicBorderCoverage(this,ADart,3);
00065 }
00066
00067 return NULL;
00068 }
00069
00070 INLINE
00071 CCoverage* CGMap::getStaticCoverage(const CDart* ADart, TOrbit AOrbit)
00072 {
00073 switch (AOrbit)
00074 {
00075 case ORBIT_SELF: return new CStaticCoverageSelf (this,ADart );
00076 case ORBIT_0: return new CStaticCoverage0 (this,ADart );
00077 case ORBIT_1: return new CStaticCoverage1 (this,ADart );
00078 case ORBIT_01: return new CStaticCoverage01 (this,ADart );
00079 case ORBIT_2: return new CStaticCoverage2 (this,ADart );
00080 case ORBIT_02: return new CStaticCoverage02 (this,ADart );
00081 case ORBIT_12: return new CStaticCoverage12 (this,ADart );
00082 case ORBIT_012: return new CStaticCoverage012 (this,ADart );
00083 case ORBIT_3: return new CStaticCoverage3 (this,ADart );
00084 case ORBIT_03: return new CStaticCoverage03 (this,ADart );
00085 case ORBIT_13: return new CStaticCoverage13 (this,ADart );
00086 case ORBIT_013: return new CStaticCoverage013 (this,ADart );
00087 case ORBIT_23: return new CStaticCoverage23 (this,ADart );
00088 case ORBIT_023: return new CStaticCoverage023 (this,ADart );
00089 case ORBIT_123: return new CStaticCoverage123 (this,ADart );
00090 case ORBIT_0123: return new CStaticCoverage0123 (this,ADart );
00091 case ORBIT_BORDER_0: return new CStaticBorderCoverage(this,ADart,0);
00092 case ORBIT_BORDER_1: return new CStaticBorderCoverage(this,ADart,1);
00093 case ORBIT_BORDER_2: return new CStaticBorderCoverage(this,ADart,2);
00094 case ORBIT_BORDER_3: return new CStaticBorderCoverage(this,ADart,3);
00095 }
00096
00097 return NULL;
00098 }
00099
00100 INLINE
00101 CCoverage* CGMap::getBasicDynamicCoverage(const CDart* ADart, TOrbit AOrbit,
00102 int AMarkNumber)
00103 {
00104 switch (AOrbit)
00105 {
00106 case ORBIT_012: return new CBasicDynamicCoverage012 (this,ADart ,
00107 AMarkNumber);
00108 case ORBIT_123: return new CBasicDynamicCoverage123 (this,ADart ,
00109 AMarkNumber);
00110 case ORBIT_0123: return new CBasicDynamicCoverage0123(this,ADart ,
00111 AMarkNumber);
00112 case ORBIT_BORDER_0: return new CBasicBorderCoverage (this,ADart,0,
00113 AMarkNumber);
00114 case ORBIT_BORDER_1: return new CBasicBorderCoverage (this,ADart,1,
00115 AMarkNumber);
00116 case ORBIT_BORDER_2: return new CBasicBorderCoverage (this,ADart,2,
00117 AMarkNumber);
00118 case ORBIT_BORDER_3: return new CBasicBorderCoverage (this,ADart,3,
00119 AMarkNumber);
00120 }
00121
00122 return NULL;
00123 }
00124
00125 INLINE
00126 CCoverage* CGMap::getMultiDynamicCoverage(const CDart* D, TOrbit orbit)
00127 {
00128 switch (orbit)
00129 {
00130 case ORBIT_012: return new CMultiDynamicCoverage012 (this, D);
00131 case ORBIT_123: return new CMultiDynamicCoverage123 (this, D);
00132 case ORBIT_0123: return new CMultiDynamicCoverage0123(this, D);
00133 }
00134
00135 return NULL;
00136 }
00137
00138 INLINE
00139 bool CGMap::isSameOrbit(CDart* ADart1, CDart* D2, TOrbit orbit)
00140 {
00141 bool found = false;
00142
00143 CCoverage* C = getDynamicCoverage(ADart1,orbit);
00144
00145 while (!found && C->cont())
00146 if ((*C)++ == D2)
00147 found = true;
00148
00149 delete C;
00150
00151 return found;
00152 }
00153
00154 INLINE
00155 CDart* CGMap::getEmbeddingOwner(const CDart* D, TOrbit orbit)
00156 {
00157 CCoverage* C = getDynamicCoverage(D, orbit);
00158 CDart* res = NULL;
00159 bool found = false;
00160
00161 while (!found && C->cont())
00162 {
00163 if ((**C)->isOrbitUsed(orbit))
00164 {
00165 res = **C;
00166 found = true;
00167 }
00168 else
00169 ++ * C;
00170 }
00171
00172 delete C;
00173
00174 return res;
00175 }
00176
00177 INLINE
00178 CAttribute * CGMap::getAttribute(const CDart* D, TOrbit orbit,
00179 TAttributeId typeAttr)
00180 {
00181 assert(isOrbitUsed(orbit));
00182 CDart* Do = getEmbeddingOwner(D, orbit);
00183
00184 if ( Do!=NULL )
00185 return Do->getAttribute(orbit,typeAttr);
00186
00187 return NULL;
00188 }
00189
00190 INLINE
00191 void CGMap::addAttribute(CDart* D, TOrbit orbit, CAttribute * A)
00192 {
00193 assert(isOrbitUsed(orbit));
00194 CDart* Do = getEmbeddingOwner(D,orbit);
00195
00196 if ( Do==NULL )
00197 Do = D;
00198
00199 Do->addAttribute(orbit,A);
00200 }
00201
00202 INLINE
00203 CAttribute * CGMap::removeAttribute(CDart* D, TOrbit orbit,
00204 TAttributeId typeAttr)
00205 {
00206 assert(isOrbitUsed(orbit));
00207
00208 CDart* Do = getEmbeddingOwner(D,orbit);
00209
00210 if (Do!=NULL)
00211 return Do->removeAttribute(orbit,typeAttr);
00212
00213 return NULL;
00214 }
00215
00216 INLINE
00217 void CGMap::deleteAttribute(CDart* D, TOrbit orbit, TAttributeId typeAttr)
00218 {
00219 delete removeAttribute(D, orbit, typeAttr);
00220 }
00221
00222 INLINE
00223 bool CGMap::isSameOrbit(CDart* ADart1, CDart* ADart2, TOrbit AOrbit,
00224 CDart*& ADartEmbeddingOwner1)
00225 {
00226 CCoverage * cov = getDynamicCoverage(ADart1, AOrbit);
00227 ADartEmbeddingOwner1 = NULL;
00228 bool found = false;
00229
00230 while (!found && cov->cont())
00231 {
00232 if (**cov == ADart2)
00233 found = true;
00234
00235 if ((**cov)->isOrbitUsed(AOrbit))
00236 ADartEmbeddingOwner1 = **cov;
00237
00238 ++ *cov;
00239 }
00240
00241 delete cov;
00242 return found;
00243 }
00244
00245 INLINE
00246 bool CGMap::isValidOrbit(CDart* ADart, TOrbit AOrbit)
00247 {
00248 for (int i=0; i<2; ++i)
00249 for (int j=i+2; j<4; ++j)
00250 if ((AOrbit & ORBIT_DIM[i]) && (AOrbit & ORBIT_DIM[j]) &&
00251 alpha(alpha(ADart, i), j) != alpha(alpha(ADart, j), i))
00252 return false;
00253
00254 return true;
00255 }
00256
00257 INLINE
00258 void CGMap::groupAttributes(CDart* ADart1, CDart* D2, TMask16 AMask)
00259 {
00260 TOrbit i,j;
00261
00262 CDart* d1;
00263 CDart* d2;
00264
00265 for (i = ORBIT_0; i <= ORBIT_0123; ++i)
00266 if (AMask[i] && isOrbitUsed(i) && isValidOrbit(ADart1, i))
00267 {
00268 if (isSameOrbit(ADart1, D2, i, d1))
00269 for (j = i+1; j <= ORBIT_0123; ++j)
00270 {
00271 if (IS_ORBIT_INCLUDED(i,j))
00272 AMask.set(j,false);
00273 }
00274 else
00275 {
00276 d2 = getEmbeddingOwner(D2,i);
00277
00278 if (d1!=NULL && d2!=NULL)
00279 {
00280 CEmbedding *E = d1->removeEmbedding(i);
00281 assert(E!=NULL);
00282
00283 d2->mergeEmbedding(E);
00284
00285 E->destroy();
00286 }
00287 }
00288 }
00289 }
00290
00291 INLINE
00292 void CGMap::duplicateAttributes(CDart* ADart1, CDart* D2, TMask16 AMask)
00293 {
00294 TOrbit i,j;
00295 CDart* d1;
00296
00297 for (i = ORBIT_0; i <= ORBIT_0123; ++i)
00298 if (AMask[i] && isOrbitUsed(i) && isValidOrbit(ADart1, i))
00299 {
00300 if (isSameOrbit(ADart1, D2, i, d1))
00301 {
00302 for (j = i+1; j <= ORBIT_0123; ++j)
00303 if (IS_ORBIT_INCLUDED(i,j))
00304 AMask.set(j,false);
00305 }
00306 else
00307 {
00308 if (d1==NULL)
00309 {
00310 d1 = getEmbeddingOwner(D2,i);
00311 if (d1!=NULL)
00312 ADart1->addEmbedding((d1->getEmbedding(i))->copy());
00313 }
00314 else
00315 {
00316
00317 assert(getEmbeddingOwner(D2,i)==NULL);
00318 D2->addEmbedding((d1->getEmbedding(i))->copy());
00319 }
00320 }
00321 }
00322 }
00323
00324 INLINE
00325 bool CGMap::canSew0(CDart* d1, CDart* d2)
00326 {
00327 assert(d1!=NULL && d2!=NULL);
00328 return canSew(d1,d2, 0);
00329 }
00330
00331 INLINE
00332 bool CGMap::canSew1(CDart* d1, CDart* d2)
00333 {
00334 assert(d1!=NULL && d2!=NULL);
00335 return canSew(d1,d2, 1);
00336 }
00337
00338 INLINE
00339 bool CGMap::canSew2(CDart* d1, CDart* d2)
00340 {
00341 assert(d1!=NULL && d2!=NULL);
00342 return canSew(d1,d2, 2);
00343 }
00344
00345 INLINE
00346 bool CGMap::canSew3(CDart* d1, CDart* d2)
00347 {
00348 return canSew(d1,d2, 3);
00349 }
00350
00351 INLINE
00352 bool CGMap::canSew(CDart* d1, CDart* d2, int i)
00353 {
00354 assert(d1!=NULL && d2!=NULL);
00355
00356 if ( d1==d2 || !isFree(d1,i) || !isFree(d2,i) )
00357 return false;
00358
00359 CCoverage* cov1 = getDynamicCoverage(d1, ORBIT_INVO[i]);
00360 CCoverage* cov2 = getDynamicCoverage(d2, ORBIT_INVO[i]);
00361
00362 while (cov1->cont() && cov2->cont() &&
00363 cov1->prevOperationType()==cov2->prevOperationType())
00364 {
00365 ++(*cov1);
00366 ++(*cov2);
00367 }
00368
00369 bool ok = !cov1->cont() && !cov2->cont();
00370
00371 delete cov1;
00372 delete cov2;
00373
00374 return ok;
00375 }
00376
00377 INLINE
00378 void CGMap::dartSew0(CDart* ADart1, CDart* ADart2)
00379 {
00380 groupAttributes(ADart1,ADart2,MASK0);
00381 linkAlpha0(ADart1,ADart2);
00382 }
00383
00384 INLINE
00385 void CGMap::dartSew1(CDart* ADart1, CDart* ADart2)
00386 {
00387 groupAttributes(ADart1,ADart2,MASK1);
00388 linkAlpha1(ADart1,ADart2);
00389 }
00390
00391 INLINE
00392 void CGMap::dartSew2(CDart* ADart1, CDart* ADart2)
00393 {
00394 groupAttributes(ADart1,ADart2,MASK2);
00395 linkAlpha2(ADart1,ADart2);
00396 }
00397
00398 INLINE
00399 void CGMap::dartSew3(CDart* ADart1, CDart* ADart2)
00400 {
00401 groupAttributes(ADart1,ADart2,MASK3);
00402 linkAlpha3(ADart1,ADart2);
00403 }
00404
00405 INLINE
00406 void CGMap::dartSew(CDart* ADart1, CDart* ADart2, int ADimension)
00407 {
00408 switch(ADimension)
00409 {
00410 case 0: dartSew0(ADart1, ADart2); break;
00411 case 1: dartSew1(ADart1, ADart2); break;
00412 case 2: dartSew2(ADart1, ADart2); break;
00413 case 3: dartSew3(ADart1, ADart2); break;
00414 }
00415 }
00416
00417 INLINE
00418 void CGMap::dartUnsew0(CDart* ADart)
00419 {
00420 assert(ADart!=NULL);
00421 assert(!isFree0(ADart));
00422
00423 CDart* D2 = alpha0(ADart);
00424 unlinkAlpha0(ADart);
00425 duplicateAttributes(ADart,D2,MASK0);
00426 }
00427
00428 INLINE
00429 void CGMap::dartUnsew1(CDart* ADart)
00430 {
00431 assert(ADart!=NULL);
00432 assert(!isFree1(ADart));
00433
00434 CDart* D2 = alpha1(ADart);
00435 unlinkAlpha1(ADart);
00436 duplicateAttributes(ADart,D2,MASK1);
00437 }
00438
00439 INLINE
00440 void CGMap::dartUnsew2(CDart* ADart)
00441 {
00442 assert(ADart!=NULL);
00443 assert(!isFree2(ADart));
00444
00445 CDart* D2 = alpha2(ADart);
00446 unlinkAlpha2(ADart);
00447 duplicateAttributes(ADart,D2,MASK2);
00448 }
00449
00450 INLINE
00451 void CGMap::dartUnsew3(CDart* ADart)
00452 {
00453 assert(ADart!=NULL);
00454 assert(!isFree3(ADart));
00455
00456 CDart* D2 = alpha3(ADart);
00457 unlinkAlpha3(ADart);
00458 duplicateAttributes(ADart,D2,MASK3);
00459 }
00460
00461 INLINE
00462 void CGMap::dartUnsew(CDart* ADart, int ADimension)
00463 {
00464 switch(ADimension)
00465 {
00466 case 0: dartUnsew0(ADart); break;
00467 case 1: dartUnsew1(ADart); break;
00468 case 2: dartUnsew2(ADart); break;
00469 case 3: dartUnsew3(ADart); break;
00470 }
00471 }
00472
00473 INLINE
00474 void CGMap::topoSew0(CDart* ADart1, CDart* ADart2)
00475 {
00476 assert(canSew0(ADart1,ADart2));
00477
00478 CDynamicCoverage23 I1(this,ADart1);
00479 CDynamicCoverage23 I2(this,ADart2);
00480
00481 while (I1.cont())
00482 linkAlpha0(I1++,I2++);
00483 }
00484
00485 INLINE
00486 void CGMap::topoSew1(CDart* ADart1, CDart* ADart2)
00487 {
00488 assert(canSew1(ADart1,ADart2));
00489
00490 linkAlpha1(ADart1,ADart2);
00491
00492 if (!isFree3(ADart1))
00493 linkAlpha1(alpha3(ADart1),alpha3(ADart2));
00494 }
00495
00496 INLINE
00497 void CGMap::topoSew2(CDart* ADart1, CDart* ADart2)
00498 {
00499 assert(canSew2(ADart1,ADart2));
00500
00501 linkAlpha2(ADart1,ADart2);
00502
00503 if (!isFree0(ADart1))
00504 linkAlpha2(alpha0(ADart1),alpha0(ADart2));
00505 }
00506
00507
00508 INLINE
00509 void CGMap::topoSew3(CDart* ADart1, CDart* ADart2)
00510 {
00511 assert(canSew3(ADart1,ADart2));
00512
00513 CDynamicCoverage01 I1(this, ADart1);
00514 CDynamicCoverage01 I2(this, ADart2);
00515
00516 while( I1.cont() )
00517 linkAlpha3(I1++,I2++);
00518 }
00519
00520 INLINE
00521 void CGMap::topoSew(CDart* ADart1, CDart* ADart2, int ADimension)
00522 {
00523 switch(ADimension)
00524 {
00525 case 0: topoSew0(ADart1, ADart2); break;
00526 case 1: topoSew1(ADart1, ADart2); break;
00527 case 2: topoSew2(ADart1, ADart2); break;
00528 case 3: topoSew3(ADart1, ADart2); break;
00529 }
00530 }
00531
00532 INLINE
00533 void CGMap::topoUnsew0(CDart* ADart)
00534 {
00535 assert(!isFree0(ADart));
00536
00537 CDynamicCoverage23 I(this,ADart);
00538 while (I.cont())
00539 unlinkAlpha0(I++);
00540 }
00541
00542 INLINE
00543 void CGMap::topoUnsew1(CDart* ADart)
00544 {
00545 assert(!isFree1(ADart));
00546
00547 unlinkAlpha1(ADart);
00548 if (!isFree3(ADart))
00549 unlinkAlpha1(alpha3(ADart));
00550 }
00551
00552 INLINE
00553 void CGMap::topoUnsew2(CDart* ADart)
00554 {
00555 assert(!isFree2(ADart));
00556
00557 unlinkAlpha2(ADart);
00558 if (!isFree0(ADart))
00559 unlinkAlpha2(alpha0(ADart));
00560 }
00561
00562 INLINE
00563 void CGMap::topoUnsew3(CDart* ADart)
00564 {
00565 assert(!isFree3(ADart));
00566
00567 CDynamicCoverage01 I(this, ADart);
00568 while (I.cont())
00569 unlinkAlpha3(I++);
00570 }
00571
00572 INLINE
00573 void CGMap::topoUnsew(CDart* ADart, int ADimension)
00574 {
00575 switch(ADimension)
00576 {
00577 case 0: topoUnsew0(ADart); break;
00578 case 1: topoUnsew1(ADart); break;
00579 case 2: topoUnsew2(ADart); break;
00580 case 3: topoUnsew3(ADart); break;
00581 }
00582 }
00583
00584 INLINE
00585 void CGMap::sew0(CDart* ADart1, CDart* ADart2)
00586 {
00587 assert(canSew0(ADart1,ADart2));
00588
00589 CDynamicCoverage23 I1(this, ADart1);
00590 CDynamicCoverage23 I2(this, ADart2);
00591
00592 CDart*d1 = I1++;
00593 CDart*d2 = I2++;
00594
00595 groupAttributes(d1,d2,MASK0);
00596 linkAlpha(d1,d2,0);
00597
00598 while (I1.cont())
00599 {
00600 d1 = *I1; d2 = *I2;
00601
00602
00603 if (I1.prevOperationType() == OP_ALPHAI)
00604 {
00605
00606
00607 groupAttributes(d1,d2,MASK0M2);
00608 }
00609 else
00610 {
00611
00612
00613 groupAttributes(d1,d2,MASK0M3);
00614 }
00615
00616 linkAlpha(d1,d2,0);
00617
00618 ++I1; ++I2;
00619 }
00620 }
00621
00622
00623 INLINE
00624 void CGMap::sew1(CDart* ADart1, CDart* ADart2)
00625 {
00626 assert(canSew1(ADart1,ADart2));
00627
00628 groupAttributes(ADart1,ADart2,MASK1);
00629 linkAlpha(ADart1,ADart2, 1);
00630
00631 if (!isFree3(ADart1))
00632 {
00633
00634
00635 groupAttributes(alpha3(ADart1),alpha3(ADart2), MASK1M3);
00636 linkAlpha(alpha3(ADart1),alpha3(ADart2), 1);
00637 }
00638 }
00639
00640 INLINE
00641 void CGMap::sew2(CDart* ADart1, CDart* ADart2)
00642 {
00643 assert(canSew2(ADart1,ADart2));
00644
00645 groupAttributes(ADart1,ADart2, MASK2);
00646 linkAlpha(ADart1,ADart2, 2);
00647
00648 if (!isFree0(ADart1))
00649 {
00650
00651
00652 groupAttributes(alpha0(ADart1),alpha0(ADart2), MASK2M0);
00653 linkAlpha(alpha0(ADart1),alpha0(ADart2), 2);
00654 }
00655 }
00656
00657
00658 INLINE
00659 void CGMap::sew3(CDart* ADart1, CDart* ADart2)
00660 {
00661 assert(canSew3(ADart1,ADart2));
00662
00663 CDynamicCoverage01 I1(this, ADart1);
00664 CDynamicCoverage01 I2(this, ADart2);
00665
00666 CDart* d1 = I1++;
00667 CDart* d2 = I2++;
00668
00669 groupAttributes(d1,d2, MASK3);
00670 linkAlpha(d1,d2, 3);
00671
00672 while(I1.cont())
00673 {
00674 d1 = *I1;
00675 d2 = *I2;
00676
00677 if (I1.prevOperationType()==OP_ALPHAI)
00678 {
00679
00680
00681 groupAttributes(d1,d2, MASK3M0);
00682 }
00683 else
00684 {
00685
00686
00687 groupAttributes(d1,d2, MASK3M1);
00688 }
00689
00690 linkAlpha(d1,d2,3);
00691 ++I1; ++I2;
00692 }
00693 }
00694
00695
00696
00697 INLINE
00698 void CGMap::sew(CDart* ADart1, CDart* ADart2, int ADimension)
00699 {
00700 switch(ADimension)
00701 {
00702 case 0: sew0(ADart1, ADart2); break;
00703 case 1: sew1(ADart1, ADart2); break;
00704 case 2: sew2(ADart1, ADart2); break;
00705 case 3: sew3(ADart1, ADart2); break;
00706 }
00707 }
00708
00709
00710 INLINE
00711 void CGMap::unsew0(CDart* ADart)
00712 {
00713 assert(!isFree0(ADart));
00714
00715 CDart* d1 = NULL;
00716 CDart* d2 = NULL;
00717 bool prevai;
00718 CDynamicCoverage23 It(this, ADart);
00719
00720 while(It.cont())
00721 {
00722 d1 = *It; d2 = alpha0(d1);
00723 unlinkAlpha0(d1);
00724 prevai = (It.prevOperationType()==OP_ALPHAI);
00725 ++It;
00726
00727 if (It.cont())
00728 {
00729 if (prevai)
00730 {
00731
00732
00733 duplicateAttributes(d1,d2,MASK0M3);
00734 }
00735 else
00736 {
00737
00738
00739 duplicateAttributes(d1,d2,MASK0M2);
00740 }
00741 }
00742 }
00743
00744 duplicateAttributes(d1,d2,MASK0);
00745
00746
00747
00748
00749
00750 }
00751
00752 INLINE
00753 void CGMap::unsew1(CDart* ADart)
00754 {
00755 assert(!isFree1(ADart));
00756
00757 CDart* D2 = alpha1(ADart);
00758 unlinkAlpha1(ADart);
00759
00760 if (!isFree3(ADart))
00761 {
00762 duplicateAttributes(ADart,D2,MASK1M3);
00763 ADart = alpha3(ADart); D2 = alpha1(ADart);
00764 unlinkAlpha1(ADart);
00765 }
00766
00767 duplicateAttributes(ADart,D2, MASK1);
00768
00769
00770
00771
00772 }
00773
00774
00775 INLINE
00776 void CGMap::unsew2(CDart* ADart)
00777 {
00778 assert(!isFree2(ADart));
00779
00780 CDart* D2 = alpha2(ADart);
00781 unlinkAlpha2(ADart);
00782
00783 if (!isFree0(ADart))
00784 {
00785 duplicateAttributes(ADart,D2,MASK2M0);
00786 ADart = alpha0(ADart); D2 = alpha2(ADart);
00787 unlinkAlpha2(ADart);
00788 }
00789
00790 duplicateAttributes(ADart,D2,MASK2);
00791
00792
00793
00794
00795 }
00796
00797
00798 INLINE
00799 void CGMap::unsew3(CDart* ADart)
00800 {
00801 assert(!isFree3(ADart));
00802
00803 CDart* d1 = NULL;
00804 CDart* d2 = NULL;
00805 bool prevai;
00806 CDynamicCoverage01 It(this, ADart);
00807
00808 while(It.cont())
00809 {
00810 d1 = *It; d2 = alpha3(d1);
00811 unlinkAlpha3(d1);
00812 prevai = (It.prevOperationType()==OP_ALPHAI);
00813 ++It;
00814 if (It.cont())
00815 {
00816 if (prevai)
00817 {
00818
00819
00820 duplicateAttributes(d1,d2,MASK3M1);
00821 }
00822 else
00823 {
00824
00825
00826 duplicateAttributes(d1,d2,MASK3M0);
00827 }
00828 }
00829 }
00830
00831 duplicateAttributes(d1,d2,MASK3);
00832
00833
00834
00835
00836
00837 }
00838
00839 INLINE
00840 void CGMap::unsew(CDart* ADart,int ADimension)
00841 {
00842 switch(ADimension)
00843 {
00844 case 0: unsew0(ADart); break;
00845 case 1: unsew1(ADart); break;
00846 case 2: unsew2(ADart); break;
00847 case 3: unsew3(ADart); break;
00848 }
00849 }
00850
00851 }
00852