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 "g-map-generic.hh"
00026 using namespace GMap3d;
00027
00028 void CGMapGeneric::createTopoMesh1(int ASx,
00029 CDart * AMesh1Corners[2],
00030 CDart * ADart)
00031 {
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 assert(ASx>=0);
00064 assert(AMesh1Corners!=NULL);
00065
00066
00067
00068 int m = 0, n = 0;
00069 bool closed;
00070
00071 if (ADart==NULL)
00072 closed = false;
00073 else
00074 {
00075 CDart * last = NULL;
00076 bool jumped = false;
00077
00078 for (CDynamicCoverage23 cov(this, ADart); cov.cont(); ++cov)
00079 {
00080 last = *cov;
00081
00082 switch (cov.prevOperationType())
00083 {
00084 case OP_ALPHAI:
00085 case OP_ALPHAJ:
00086 if (jumped) ++n; else ++m;
00087 break;
00088
00089 case OP_JUMP:
00090 jumped = true;
00091 ++n;
00092 break;
00093
00094 case OP_NONE:
00095 break;
00096 }
00097 }
00098
00099 closed = !isFree2(last) && !isFree3(last);
00100 }
00101
00102
00103 int i, j;
00104 int perimeter = m + n + 1;
00105 int length = ASx==0 ? 1 : 2*ASx;
00106
00107 CDart *** beam = new CDart ** [length];
00108
00109 for (j=0; j<length; ++j)
00110 {
00111 beam[j] = new CDart * [perimeter];
00112
00113 for (i=0; i<perimeter; ++i)
00114 beam[j][i] = addMapDart();
00115 }
00116
00117
00118 for (i=0; i<perimeter; ++i)
00119 for (j=1; j<length; j+=2)
00120 {
00121 linkAlpha0(beam[j-1][i], beam[j][i]);
00122
00123 if (j<length-1)
00124 linkAlpha1(beam[j][i], beam[j+1][i]);
00125 }
00126
00127
00128 bool alpha2;
00129
00130
00131 for (i=m, alpha2=true; i>0; --i, alpha2=!alpha2)
00132 if (alpha2)
00133 for (j=0; j<length; ++j)
00134 linkAlpha2(beam[j][i], beam[j][i-1]);
00135 else
00136 for (j=0; j<length; ++j)
00137 linkAlpha3(beam[j][i], beam[j][i-1]);
00138
00139
00140 for (i=m, alpha2=false; i<perimeter-1; ++i, alpha2=!alpha2)
00141 if (alpha2)
00142 for (j=0; j<length; ++j)
00143 linkAlpha2(beam[j][i], beam[j][i+1]);
00144 else
00145 for (j=0; j<length; ++j)
00146 linkAlpha3(beam[j][i], beam[j][i+1]);
00147
00148
00149 if (closed)
00150 for (j=0; j<length; ++j)
00151 linkAlpha3(beam[j][0], beam[j][perimeter-1]);
00152
00153
00154 AMesh1Corners[0] = beam[ 0][m];
00155 AMesh1Corners[1] = beam[length-1][m];
00156
00157
00158 for (j=0; j<length; ++j)
00159 delete [] beam[j];
00160
00161 delete [] beam;
00162 }
00163
00164 CDart * CGMapGeneric::createTopoMesh1(int ASx, CDart * ADart)
00165 {
00166 assert(ASx>=0);
00167
00168 CDart * extremities[2];
00169
00170 createTopoMesh1(ASx, extremities, ADart);
00171
00172 return extremities[0];
00173 }
00174
00175 void CGMapGeneric::createTopoMesh2(int ASx, int ASy,
00176 CDart * AMesh2Corners[2][2],
00177 bool A3Sewed)
00178 {
00179 assert(ASx>0);
00180 assert(ASy>0);
00181 assert(AMesh2Corners!=NULL);
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 CDart **** D = new CDart *** [ASx];
00197 int x,y,n;
00198
00199
00200 for (x=0; x<ASx; ++x)
00201 {
00202 D[x] = new CDart ** [ASy];
00203
00204 for (y=0; y<ASy; ++y)
00205 {
00206 D[x][y] = new CDart * [8];
00207
00208 for (n=0; n<8; ++n)
00209 D[x][y][n] = addMapDart();
00210 }
00211 }
00212
00213 for (x=0; x<ASx; ++x)
00214 for (y=0; y<ASy; ++y)
00215 {
00216 linkAlpha0( D[x][y][0] , D[x][y][1] );
00217 linkAlpha0( D[x][y][2] , D[x][y][3] );
00218 linkAlpha0( D[x][y][4] , D[x][y][5] );
00219 linkAlpha0( D[x][y][6] , D[x][y][7] );
00220
00221 linkAlpha1( D[x][y][1] , D[x][y][2] );
00222 linkAlpha1( D[x][y][3] , D[x][y][4] );
00223 linkAlpha1( D[x][y][5] , D[x][y][6] );
00224 linkAlpha1( D[x][y][7] , D[x][y][0] );
00225
00226 if (x>0) topoSew2( D[x][y][7] , D[x-1][y ][2] );
00227 if (y>0) topoSew2( D[x][y][0] , D[x ][y-1][5] );
00228 }
00229
00230
00231 if (A3Sewed)
00232 {
00233 for (x=0; x<ASx; ++x)
00234 for (y=0; y<ASy; ++y)
00235 for (n=0; n<8; ++n)
00236 linkAlpha3(D[x][y][n], addMapDart());
00237
00238 for (x=0; x<ASx; ++x)
00239 for (y=0; y<ASy; ++y)
00240 {
00241 linkAlpha0( alpha3( D[x][y][0] ) , alpha3( D[x][y][1] ) );
00242 linkAlpha0( alpha3( D[x][y][2] ) , alpha3( D[x][y][3] ) );
00243 linkAlpha0( alpha3( D[x][y][4] ) , alpha3( D[x][y][5] ) );
00244 linkAlpha0( alpha3( D[x][y][6] ) , alpha3( D[x][y][7] ) );
00245
00246 linkAlpha1( alpha3( D[x][y][1] ) , alpha3( D[x][y][2] ) );
00247 linkAlpha1( alpha3( D[x][y][3] ) , alpha3( D[x][y][4] ) );
00248 linkAlpha1( alpha3( D[x][y][5] ) , alpha3( D[x][y][6] ) );
00249 linkAlpha1( alpha3( D[x][y][7] ) , alpha3( D[x][y][0] ) );
00250
00251 if (x>0) topoSew2( alpha3( D[x ][y ][7] ) ,
00252 alpha3( D[x-1][y ][2] ) );
00253 if (y>0) topoSew2( alpha3( D[x ][y ][0] ) ,
00254 alpha3( D[x ][y-1][5] ) );
00255 }
00256 }
00257
00258
00259 AMesh2Corners[0][0] = D[ 0 ][ 0 ][0];
00260 AMesh2Corners[1][0] = D[ASx-1][ 0 ][1];
00261 AMesh2Corners[0][1] = D[ 0 ][ASy-1][5];
00262 AMesh2Corners[1][1] = D[ASx-1][ASy-1][4];
00263
00264
00265 for (x=0; x<ASx; ++x)
00266 {
00267 for (y=0; y<ASy; ++y)
00268 delete [] D[x][y];
00269
00270 delete [] D[x];
00271 }
00272
00273 delete [] D;
00274 }
00275
00276 CDart * CGMapGeneric::createTopoMesh2(int ASx, int ASy, bool A3Sewed)
00277 {
00278 assert(ASx>0);
00279 assert(ASy>0);
00280
00281 CDart * mesh2Corners[2][2];
00282
00283 createTopoMesh2(ASx,ASy, mesh2Corners, A3Sewed);
00284
00285 return mesh2Corners[0][0];
00286 }
00287
00288 void CGMapGeneric::createTopoMesh3(int ASx, int ASy, int ASz,
00289 CDart * AMesh3Corners[2][2][2])
00290 {
00291 assert(ASx>0);
00292 assert(ASy>0);
00293 assert(ASz>0);
00294 assert(AMesh3Corners!=NULL);
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 CDart ***** D = new CDart **** [ASx];
00316 int x, y, z, n;
00317
00318 for (x=0; x<ASx; ++x)
00319 {
00320 D[x] = new CDart *** [ASy];
00321
00322 for (y=0; y<ASy; ++y)
00323 {
00324 D[x][y] = new CDart ** [ASz];
00325
00326 for (z=0; z<ASz; ++z)
00327 {
00328 D[x][y][z] = new CDart * [48];
00329
00330 for (n=0; n<48; ++n)
00331 D[x][y][z][n] = addMapDart();
00332 }
00333 }
00334 }
00335
00336 for (x=0; x<ASx; ++x)
00337 for (y=0; y<ASy; ++y)
00338 for (z=0; z<ASz; ++z)
00339 {
00340 linkAlpha0( D[x][y][z][ 0], D[x][y][z][ 1] );
00341 linkAlpha0( D[x][y][z][ 2], D[x][y][z][ 3] );
00342 linkAlpha0( D[x][y][z][ 4], D[x][y][z][ 5] );
00343 linkAlpha0( D[x][y][z][ 6], D[x][y][z][ 7] );
00344 linkAlpha0( D[x][y][z][ 8], D[x][y][z][ 9] );
00345 linkAlpha0( D[x][y][z][10], D[x][y][z][11] );
00346 linkAlpha0( D[x][y][z][12], D[x][y][z][13] );
00347 linkAlpha0( D[x][y][z][14], D[x][y][z][15] );
00348 linkAlpha0( D[x][y][z][16], D[x][y][z][17] );
00349 linkAlpha0( D[x][y][z][18], D[x][y][z][19] );
00350 linkAlpha0( D[x][y][z][20], D[x][y][z][21] );
00351 linkAlpha0( D[x][y][z][22], D[x][y][z][23] );
00352 linkAlpha0( D[x][y][z][24], D[x][y][z][25] );
00353 linkAlpha0( D[x][y][z][26], D[x][y][z][27] );
00354 linkAlpha0( D[x][y][z][28], D[x][y][z][29] );
00355 linkAlpha0( D[x][y][z][30], D[x][y][z][31] );
00356 linkAlpha0( D[x][y][z][32], D[x][y][z][33] );
00357 linkAlpha0( D[x][y][z][34], D[x][y][z][35] );
00358 linkAlpha0( D[x][y][z][36], D[x][y][z][37] );
00359 linkAlpha0( D[x][y][z][38], D[x][y][z][39] );
00360 linkAlpha0( D[x][y][z][40], D[x][y][z][41] );
00361 linkAlpha0( D[x][y][z][42], D[x][y][z][43] );
00362 linkAlpha0( D[x][y][z][44], D[x][y][z][45] );
00363 linkAlpha0( D[x][y][z][46], D[x][y][z][47] );
00364
00365 linkAlpha1( D[x][y][z][ 0], D[x][y][z][ 7] );
00366 linkAlpha1( D[x][y][z][ 2], D[x][y][z][ 1] );
00367 linkAlpha1( D[x][y][z][ 4], D[x][y][z][ 3] );
00368 linkAlpha1( D[x][y][z][ 6], D[x][y][z][ 5] );
00369 linkAlpha1( D[x][y][z][ 8], D[x][y][z][15] );
00370 linkAlpha1( D[x][y][z][10], D[x][y][z][ 9] );
00371 linkAlpha1( D[x][y][z][12], D[x][y][z][11] );
00372 linkAlpha1( D[x][y][z][14], D[x][y][z][13] );
00373 linkAlpha1( D[x][y][z][16], D[x][y][z][23] );
00374 linkAlpha1( D[x][y][z][18], D[x][y][z][17] );
00375 linkAlpha1( D[x][y][z][20], D[x][y][z][19] );
00376 linkAlpha1( D[x][y][z][22], D[x][y][z][21] );
00377 linkAlpha1( D[x][y][z][24], D[x][y][z][31] );
00378 linkAlpha1( D[x][y][z][26], D[x][y][z][25] );
00379 linkAlpha1( D[x][y][z][28], D[x][y][z][27] );
00380 linkAlpha1( D[x][y][z][30], D[x][y][z][29] );
00381 linkAlpha1( D[x][y][z][32], D[x][y][z][39] );
00382 linkAlpha1( D[x][y][z][34], D[x][y][z][33] );
00383 linkAlpha1( D[x][y][z][36], D[x][y][z][35] );
00384 linkAlpha1( D[x][y][z][38], D[x][y][z][37] );
00385 linkAlpha1( D[x][y][z][40], D[x][y][z][47] );
00386 linkAlpha1( D[x][y][z][42], D[x][y][z][41] );
00387 linkAlpha1( D[x][y][z][44], D[x][y][z][43] );
00388 linkAlpha1( D[x][y][z][46], D[x][y][z][45] );
00389
00390 linkAlpha2( D[x][y][z][ 0], D[x][y][z][39] );
00391 linkAlpha2( D[x][y][z][ 1], D[x][y][z][38] );
00392 linkAlpha2( D[x][y][z][ 2], D[x][y][z][31] );
00393 linkAlpha2( D[x][y][z][ 3], D[x][y][z][30] );
00394 linkAlpha2( D[x][y][z][ 4], D[x][y][z][46] );
00395 linkAlpha2( D[x][y][z][ 5], D[x][y][z][47] );
00396 linkAlpha2( D[x][y][z][ 6], D[x][y][z][22] );
00397 linkAlpha2( D[x][y][z][ 7], D[x][y][z][23] );
00398 linkAlpha2( D[x][y][z][ 8], D[x][y][z][34] );
00399 linkAlpha2( D[x][y][z][ 9], D[x][y][z][35] );
00400 linkAlpha2( D[x][y][z][10], D[x][y][z][26] );
00401 linkAlpha2( D[x][y][z][11], D[x][y][z][27] );
00402 linkAlpha2( D[x][y][z][12], D[x][y][z][43] );
00403 linkAlpha2( D[x][y][z][13], D[x][y][z][42] );
00404 linkAlpha2( D[x][y][z][14], D[x][y][z][19] );
00405 linkAlpha2( D[x][y][z][15], D[x][y][z][18] );
00406 linkAlpha2( D[x][y][z][16], D[x][y][z][32] );
00407 linkAlpha2( D[x][y][z][17], D[x][y][z][33] );
00408 linkAlpha2( D[x][y][z][20], D[x][y][z][41] );
00409 linkAlpha2( D[x][y][z][21], D[x][y][z][40] );
00410 linkAlpha2( D[x][y][z][24], D[x][y][z][37] );
00411 linkAlpha2( D[x][y][z][25], D[x][y][z][36] );
00412 linkAlpha2( D[x][y][z][28], D[x][y][z][44] );
00413 linkAlpha2( D[x][y][z][29], D[x][y][z][45] );
00414
00415 if (x>0) topoSew3( D[x][y][z][ 0] , D[x-1][y ][z ][ 8] );
00416 if (y>0) topoSew3( D[x][y][z][16] , D[x ][y-1][z ][24] );
00417 if (z>0) topoSew3( D[x][y][z][32] , D[x ][y ][z-1][40] );
00418 }
00419
00420 AMesh3Corners[0][0][0] = D[ 0 ][ 0 ][ 0 ][32];
00421 AMesh3Corners[1][0][0] = D[ASx-1][ 0 ][ 0 ][33];
00422 AMesh3Corners[0][1][0] = D[ 0 ][ASy-1][ 0 ][37];
00423 AMesh3Corners[1][1][0] = D[ASx-1][ASy-1][ 0 ][36];
00424 AMesh3Corners[0][0][1] = D[ 0 ][ 0 ][ASz-1][40];
00425 AMesh3Corners[1][0][1] = D[ASx-1][ 0 ][ASz-1][41];
00426 AMesh3Corners[0][1][1] = D[ 0 ][ASy-1][ASz-1][45];
00427 AMesh3Corners[1][1][1] = D[ASx-1][ASy-1][ASz-1][44];
00428
00429
00430 for (x=0; x<ASx; ++x)
00431 {
00432 for (y=0; y<ASy; ++y)
00433 {
00434 for (z=0; z<ASz; ++z)
00435 delete [] D[x][y][z];
00436
00437 delete [] D[x][y];
00438 }
00439
00440 delete [] D[x];
00441 }
00442
00443 delete [] D;
00444 }
00445
00446 CDart * CGMapGeneric::createTopoMesh3(int ASx, int ASy, int ASz)
00447 {
00448 assert(ASx>0);
00449 assert(ASy>0);
00450 assert(ASz>0);
00451
00452 CDart * mesh3Corners[2][2][2];
00453
00454 createTopoMesh3(ASx,ASy,ASz, mesh3Corners);
00455
00456 return mesh3Corners[0][0][0];
00457 }
00458