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 "mesh-generic.hh"
00026 #include "g-map-generic.hh"
00027 using namespace GMap3d;
00028
00029 #define SIDE(DART) ((((CGMapGeneric*) FMap)->*side)(DART))
00030 #define TURN(DART) ((((CGMapGeneric*) FMap)->*turn)(DART))
00031 #define SUCC(DART) ((((CGMapGeneric*) FMap)->*succ)(DART))
00032
00033 bool CMeshGeneric::isTopoEdge(CDart* ADart, CDart* AModel)
00034 {
00035 assert(ADart!=NULL);
00036 return isTopoEdge1Meshed(ADart, 1, AModel);
00037 }
00038
00039 bool CMeshGeneric::isTopoEdge1Meshed(CDart* ADart, int ASx, CDart* AModel)
00040 {
00041 assert(ADart!=NULL);
00042
00043 int n = 0;
00044
00045 for (CDynamicCoverage01 cov(FMap, ADart); n<ASx && cov.cont(); ++cov)
00046 {
00047 if (FMap->isFree0(*cov))
00048 return false;
00049
00050 if (AModel!=NULL)
00051 {
00052 CDynamicCoverage23 covDart (FMap, *cov );
00053 CDynamicCoverage23 covModel(FMap, AModel);
00054
00055 while (covDart.cont() && covModel.cont() &&
00056 covDart.prevOperationType()==covModel.prevOperationType())
00057 {
00058 ++covDart;
00059 ++covModel;
00060 }
00061
00062 if (covDart.cont() || covModel.cont())
00063 return false;
00064 }
00065
00066 ++cov;
00067 ++n;
00068
00069 if (n<ASx && FMap->isFree1(*cov))
00070 return false;
00071 }
00072
00073 return true;
00074 }
00075
00076 bool CMeshGeneric::isTopoEdgeIMeshed(int ADim, CDart* ADart, int AS,
00077 CDart* AModel)
00078 {
00079 assert(ADim>=0 && ADim<=1);
00080 assert(ADart!=NULL);
00081 assert(AS>0);
00082
00083 if (ADim==1)
00084 return isTopoEdge1Meshed(ADart, AS, AModel);
00085
00086 return isTopoEdge(ADart, AModel);
00087 }
00088
00089 bool CMeshGeneric::isTopoSquare(CDart* ADart, bool ACheck3Sews, bool A3Sewed)
00090 {
00091 assert(ADart!=NULL);
00092 return isTopoSquare1Meshed(ADart, 1,1, ACheck3Sews, A3Sewed);
00093 }
00094
00095 bool CMeshGeneric::isTopoSquare1Meshed(CDart* ADart, int ASx, int ASy,
00096 bool ACheck3Sews, bool A3Sewed)
00097 {
00098 assert(ADart!=NULL);
00099 assert(ASx>0);
00100 assert(ASy>0);
00101
00102 if (ACheck3Sews && A3Sewed==FMap->isFree3(ADart))
00103 return false;
00104
00105 int nbDarts = 0;
00106 int nbToObtain = 4*(ASx+ASy);
00107
00108 for (CDynamicCoverage01 cov(FMap, ADart); cov.cont(); ++cov)
00109 {
00110 if (FMap->isFree0(*cov) || FMap->isFree1(*cov))
00111 return false;
00112
00113 if (++nbDarts > nbToObtain)
00114 return false;
00115 }
00116
00117 return nbDarts == nbToObtain;
00118 }
00119
00120 bool CMeshGeneric::isTopoSquare2Meshed(CDart* ADart, int ASx, int ASy,
00121 bool ACheck3Sews, bool A3Sewed)
00122 {
00123 assert(ADart!=NULL);
00124 assert(ASx>0);
00125 assert(ASy>0);
00126
00127 return isTopoSquareIMeshed(2, ADart, ASx,ASy, ACheck3Sews, A3Sewed);
00128 }
00129
00130 bool CMeshGeneric::isTopoSquare3Meshed(CDart* ADart, int ASx, int ASy,
00131 bool ACheck3Sews, bool A3Sewed)
00132 {
00133 assert(ADart!=NULL);
00134 assert(ASx>0);
00135 assert(ASy>0);
00136
00137 return isTopoSquareIMeshed(3, ADart, ASx,ASy, ACheck3Sews, A3Sewed);
00138 }
00139
00140 bool CMeshGeneric::isTopoSquareIMeshed(int ADim, CDart* ADart, int ASx, int ASy,
00141 bool ACheck3Sews, bool A3Sewed)
00142 {
00143 assert(ADim>=0 && ADim<=3);
00144 assert(ADart!=NULL);
00145 assert(ASx>0);
00146 assert(ASy>0);
00147
00148 if (ADim==0)
00149 return isTopoSquare(ADart, ACheck3Sews, A3Sewed);
00150
00151 if (ADim==1)
00152 return isTopoSquare1Meshed(ADart, ASx, ASy, ACheck3Sews, A3Sewed);
00153
00154
00155
00156 CDart* (CGMapGeneric::* succ) (CDart*) const
00157 = ADim==2 ? & CGMapGeneric::alpha0121 : & CGMapGeneric::alpha012321;
00158
00159 CDart* (CGMapGeneric::* side) (CDart*) const
00160 = ADim==2 ? & CGMapGeneric::alpha01 : & CGMapGeneric::alpha012;
00161
00162 CDart* (CGMapGeneric::* turn) (CDart*) const
00163 = ADim==2 ? & CGMapGeneric::alpha12 : & CGMapGeneric::alpha1232;
00164
00165 CDart* currentX = ADart;
00166
00167 for (int i=0; i<ASx; ++i)
00168 {
00169 CDart* currentY = FMap->alpha1(currentX);
00170
00171 for (int j=0; j<ASy; ++j)
00172 {
00173 if (!isTopoSquare(currentY, ACheck3Sews, A3Sewed))
00174 return false;
00175
00176 if (i<ASx-1)
00177 if (FMap->isFree(SIDE(FMap->alpha1(currentY)), ADim))
00178 return false;
00179
00180 if (j<ASy-1)
00181 if (FMap->isFree(SIDE( currentY ), ADim))
00182 return false;
00183
00184 if (i>0 && j>0)
00185 {
00186 CDart* tmp = currentY;
00187
00188 for (int k=0; k<4; ++k)
00189 {
00190 tmp = TURN(tmp);
00191
00192 if ((k!=3 && tmp==currentY) || (k==3 && tmp!=currentY))
00193 return false;
00194 }
00195 }
00196
00197 if (j<ASy-1)
00198 currentY = SUCC(currentY);
00199 }
00200
00201 if (i<ASx-1)
00202 currentX = SUCC(currentX);
00203 }
00204
00205 return true;
00206 }
00207
00208 bool CMeshGeneric::isFreeTopoSquareIMeshed(int ADim, CDart* ADart,
00209 int ASx, int ASy,
00210 int AMarkNumberNotX1,
00211 int AMarkNumberNotX2,
00212 int AMarkNumberNotY1,
00213 int AMarkNumberNotY2,
00214 int AReturnedDart,
00215 CDart** AOppositeDart)
00216 {
00217 assert(ADim>=0 && ADim<=2);
00218 assert(ADart!=NULL);
00219 assert(ASx>0);
00220 assert(ASy>0);
00221 assert(isTopoSquareIMeshed(ADim, ADart, ASx,ASy));
00222 assert(AMarkNumberNotX1>0);
00223 assert(AMarkNumberNotY1>0);
00224 assert(AReturnedDart>=1 && AReturnedDart<=3);
00225
00226 if (ADim==0)
00227 ASx = ASy = 1;
00228
00229 CDart* (CGMapGeneric::* succ) (CDart*) const
00230 = ADim<2 ? & CGMapGeneric::alpha01 : & CGMapGeneric::alpha0121;
00231
00232 CDart* current = ADart;
00233
00234 for (int round=0; round<2; ++round)
00235 {
00236 for (int i=0; i<ASx; ++i)
00237 {
00238 if (FMap->isMarked(current, AMarkNumberNotX1) ||
00239 (AMarkNumberNotX2>=0 &&
00240 FMap->isMarked(current, AMarkNumberNotX2)))
00241 return false;
00242
00243 if (FMap->isMarked(FMap->alpha0(current), AMarkNumberNotX1) ||
00244 (AMarkNumberNotX2>=0 &&
00245 FMap->isMarked(FMap->alpha0(current), AMarkNumberNotX2)))
00246 return false;
00247
00248 if (i<ASx-1)
00249 current = SUCC(current);
00250 }
00251
00252 current = FMap->alpha0(current);
00253
00254 if (AOppositeDart!=NULL)
00255 {
00256 if (round==0 && AReturnedDart==1)
00257 * AOppositeDart = current;
00258
00259 if (round==1 && AReturnedDart==2)
00260 * AOppositeDart = current;
00261 }
00262
00263 current = FMap->alpha1(current);
00264
00265 for (int j=0; j<ASy; ++j)
00266 {
00267 if (FMap->isMarked(current, AMarkNumberNotY1) ||
00268 (AMarkNumberNotY2>=0 &&
00269 FMap->isMarked(current, AMarkNumberNotY2)))
00270 return false;
00271
00272 if (FMap->isMarked(FMap->alpha0(current), AMarkNumberNotY1) ||
00273 (AMarkNumberNotY2>=0 &&
00274 FMap->isMarked(FMap->alpha0(current), AMarkNumberNotY2)))
00275 return false;
00276
00277 if (j<ASy-1)
00278 current = SUCC(current);
00279 }
00280
00281 current = FMap->alpha01(current);
00282
00283 if (AOppositeDart!=NULL)
00284 {
00285 if (round==0 && AReturnedDart==3)
00286 * AOppositeDart = current;
00287 }
00288 }
00289
00290 return true;
00291 }
00292
00293 CDart* CMeshGeneric::isTopoEdgeOfCubeIMeshed(int ADim,
00294 CDart* ADart1, CDart* ADart2,
00295 int AS)
00296 {
00297 assert(ADim==1 || ADim==2);
00298 assert(ADart1!=NULL);
00299 assert(ADart2!=NULL);
00300
00301 CDart* (CGMapGeneric::* succ) (CDart*) const
00302 = ADim==1 ? & CGMapGeneric::alpha01 : & CGMapGeneric::alpha0121;
00303
00304 CDart* current1 = ADart1;
00305 CDart* current2 = ADart2;
00306
00307 for (int i=0; i<AS; ++i)
00308 {
00309 if (FMap->alpha2(current1)!=current2)
00310 return NULL;
00311
00312 if (i<AS-1)
00313 {
00314 current1 = SUCC(current1);
00315 current2 = SUCC(current2);
00316 }
00317 }
00318
00319 return FMap->alpha0(current1);
00320 }
00321
00322 bool CMeshGeneric::isTopoCube(CDart* ADart)
00323 {
00324 assert(ADart!=NULL);
00325
00326 return isTopoCube1Meshed(ADart, 1,1,1);
00327 }
00328
00329 bool CMeshGeneric::isTopoCube1Meshed(CDart* ADart, int ASx, int ASy, int ASz)
00330 {
00331 assert(ADart!=NULL);
00332 assert(ASx>0);
00333 assert(ASy>0);
00334 assert(ASz>0);
00335
00336 return isTopoCubeIMeshed(1, ADart, ASx,ASy,ASz);
00337 }
00338
00339 bool CMeshGeneric::isTopoCube2Meshed(CDart* ADart, int ASx, int ASy, int ASz)
00340 {
00341 assert(ADart!=NULL);
00342 assert(ASx>0);
00343 assert(ASy>0);
00344 assert(ASz>0);
00345
00346 return isTopoCubeIMeshed(2, ADart, ASx,ASy,ASz);
00347 }
00348
00349 bool CMeshGeneric::isTopoCube3Meshed(CDart* ADart, int ASx, int ASy, int ASz)
00350 {
00351 assert(ADart!=NULL);
00352 assert(ASx>0);
00353 assert(ASy>0);
00354 assert(ASz>0);
00355
00356 CDart* currentX = ADart;
00357
00358 for (int i=0; i<ASx; ++i)
00359 {
00360 CDart* currentY = FMap->alpha12(currentX);
00361
00362 for (int j=0; j<ASy; ++j)
00363 {
00364 CDart* currentZ = FMap->alpha12(currentY);
00365
00366 for (int k=0; k<ASz; ++k)
00367 {
00368 if (!isTopoCube(currentZ))
00369 return false;
00370
00371 if (k<ASz-1)
00372 {
00373 currentZ = FMap->alpha012(currentZ);
00374
00375 if (FMap->isFree3(currentZ))
00376 return false;
00377
00378 currentZ = FMap->alpha321(currentZ);
00379 }
00380 }
00381
00382 if (j<ASy-1)
00383 {
00384 currentY = FMap->alpha012(currentY);
00385
00386 if (FMap->isFree3(currentY))
00387 return false;
00388
00389 currentY = FMap->alpha321(currentY);
00390 }
00391 }
00392
00393 if (i<ASx-1)
00394 {
00395 currentX = FMap->alpha012(currentX);
00396
00397 if (FMap->isFree3(currentX))
00398 return false;
00399
00400 currentX = FMap->alpha321(currentX);
00401 }
00402 }
00403
00404 return true;
00405 }
00406
00407 bool CMeshGeneric::isTopoCubeIMeshed(int ADim,
00408 CDart* ADart, int ASx, int ASy, int ASz)
00409 {
00410 assert(ADim>=0 && ADim<=3);
00411 assert(ADart!=NULL);
00412
00413 if (ADim==0) return isTopoCube(ADart);
00414 if (ADim==3) return isTopoCube3Meshed(ADart, ASx,ASy,ASz);
00415
00416
00417
00418 CDart* memo[4];
00419 CDart* current = ADart;
00420 int i;
00421
00422
00423 if (!isTopoSquareIMeshed(ADim, current, ASx, ASy))
00424 return false;
00425
00426 for (i=0; i<4; ++i)
00427 {
00428 memo[i] = current;
00429
00430 int len = i%2 == 0 ? ASx : ASy;
00431
00432
00433 if (FMap->isFree2(current) ||
00434 ! isTopoSquareIMeshed(ADim, FMap->alpha2(current), len, ASz))
00435 return false;
00436
00437
00438 current = isTopoEdgeOfCubeIMeshed(ADim, current,
00439 FMap->alpha2(current), len);
00440
00441 if (current==NULL)
00442 return false;
00443
00444 current = FMap->alpha1(current);
00445 }
00446
00447
00448 for (i=0; i<4; ++i)
00449 if (FMap->degree(memo[i], 0, 3) != 3)
00450 return false;
00451
00452
00453 for (i=0; i<4; ++i)
00454 {
00455 memo[i] = FMap->alpha21(memo[i]);
00456
00457 if (FMap->isFree2(memo[i]))
00458 return false;
00459
00460 memo[i] = isTopoEdgeOfCubeIMeshed(ADim, memo[i],
00461 FMap->alpha2(memo[i]), ASz);
00462
00463 if (memo[i]==NULL || FMap->isFree2(FMap->alpha1(memo[i])))
00464 return false;
00465
00466 memo[i] = FMap->alpha12(memo[i]);
00467 }
00468
00469
00470 if (! isTopoSquareIMeshed(ADim, memo[0], ASx, ASy))
00471 return false;
00472
00473
00474 for (i=0; i<4; ++i)
00475 if (FMap->degree(memo[i], 0, 3) != 3)
00476 return false;
00477
00478
00479 for (i=0; i<4; ++i)
00480 {
00481 int len = i%2 == 0 ? ASx : ASy;
00482
00483 if (isTopoEdgeOfCubeIMeshed(ADim, memo[i],
00484 FMap->alpha2(memo[i]), len) == NULL)
00485 return false;
00486 }
00487
00488 return true;
00489 }
00490
00491 bool CMeshGeneric::isFreeTopoCubeIMeshed(int ADim, CDart* ADart,
00492 int ASx, int ASy, int ASz,
00493 int AMarkNumberNotX1,
00494 int AMarkNumberNotX2,
00495 int AMarkNumberNotY1,
00496 int AMarkNumberNotY2,
00497 int AMarkNumberNotZ1,
00498 int AMarkNumberNotZ2)
00499 {
00500 assert(ADim>=0 && ADim<=3);
00501 assert(ADart!=NULL);
00502 assert(ASx>0);
00503 assert(ASy>0);
00504 assert(ASz>0);
00505 assert(isTopoCubeIMeshed(ADim, ADart, ASx,ASy,ASz));
00506 assert(AMarkNumberNotX1>0);
00507 assert(AMarkNumberNotY1>0);
00508 assert(AMarkNumberNotZ1>0);
00509
00510 if (ADim==0)
00511 ASx = ASy = ASz = 1;
00512
00513 int s[3] = { ASx, ASy, ASz };
00514 int m[3][2] =
00515 {
00516 { AMarkNumberNotX1, AMarkNumberNotX2 },
00517 { AMarkNumberNotY1, AMarkNumberNotY2 },
00518 { AMarkNumberNotZ1, AMarkNumberNotZ2 },
00519 };
00520
00521 CDart* current = ADart;
00522
00523 for (int dim=0; dim<3; ++dim)
00524 {
00525 CDart* next;
00526
00527 if (! isFreeTopoSquareIMeshed(ADim, current, s[dim], s[(dim+1)%3],
00528 m[dim][0], m[dim][1],
00529 m[(dim+1)%3][0], m[(dim+1)%3][1],
00530 3, &next))
00531 return false;
00532
00533 if (! isFreeTopoSquareIMeshed(ADim, FMap->alpha12(next),
00534 s[(dim+1)%3], s[(dim+2)%3],
00535 m[(dim+1)%3][0], m[(dim+1)%3][1],
00536 m[(dim+2)%3][0], m[(dim+2)%3][1]))
00537 return false;
00538
00539 current = FMap->alpha12(current);
00540 }
00541
00542 return true;
00543 }
00544