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 CDart * CGMapGeneric::createTopoTriangle()
00029 {
00030 CDart * dart[6];
00031
00032 for (int i=0; i<6; ++i)
00033 dart[i] = addMapDart();
00034
00035 linkAlpha0(dart[0], dart[1]); linkAlpha1(dart[1], dart[2]);
00036 linkAlpha0(dart[2], dart[3]); linkAlpha1(dart[3], dart[4]);
00037 linkAlpha0(dart[4], dart[5]); linkAlpha1(dart[5], dart[0]);
00038
00039 return dart[0];
00040 }
00041
00042 CDart * CGMapGeneric::createTopoSquare()
00043 {
00044 CDart * dart[8];
00045
00046 for (int i=0; i<8; ++i)
00047 dart[i] = addMapDart();
00048
00049 linkAlpha0(dart[0], dart[1]); linkAlpha1(dart[1], dart[2]);
00050 linkAlpha0(dart[2], dart[3]); linkAlpha1(dart[3], dart[4]);
00051 linkAlpha0(dart[4], dart[5]); linkAlpha1(dart[5], dart[6]);
00052 linkAlpha0(dart[6], dart[7]); linkAlpha1(dart[7], dart[0]);
00053
00054 return dart[0];
00055 }
00056
00057 CDart * CGMapGeneric::createTopoPolygon(int An)
00058 {
00059 assert(An>0);
00060
00061 CDart * dart0, * current = NULL, * current0, * current01;
00062
00063 linkAlpha0(dart0 = addMapDart(), current01 = addMapDart());
00064
00065 for (int i=1; i<An; ++i)
00066 {
00067 current = addMapDart();
00068 current0 = addMapDart();
00069
00070 linkAlpha0(current , current0 );
00071 linkAlpha1(current0, current01);
00072
00073 current01 = current;
00074 }
00075
00076 linkAlpha1(current, dart0);
00077
00078 return dart0;
00079 }
00080
00081 CDart * CGMapGeneric::createTopoOpenedPole(int An)
00082 {
00083 assert(An>0);
00084
00085 CDart * dart0, * current = NULL, * current21;
00086
00087 dart0 = current21 = createTopoTriangle();
00088
00089 for (int i=1; i<An; ++i)
00090 {
00091 current = createTopoTriangle();
00092 topoSew2(current, alpha1(current21));
00093 current21 = current;
00094 }
00095
00096
00097
00098
00099 return dart0;
00100 }
00101
00102 CDart * CGMapGeneric::createTopoPole(int An)
00103 {
00104 assert(An>0);
00105
00106 CDart * dart0, * current=NULL, * current21;
00107
00108 dart0 = current21 = createTopoTriangle();
00109
00110 for (int i=1; i<An; ++i)
00111 {
00112 current = createTopoTriangle();
00113 topoSew2(current, alpha1(current21));
00114 current21 = current;
00115 }
00116
00117 topoSew2(alpha1(current), dart0);
00118
00119 return dart0;
00120 }
00121
00122 void CGMapGeneric::createTopoTube(int AMeridians, int AParallels,
00123 CDart * * ABorder1, CDart * * ABorder2)
00124 {
00125 assert(AMeridians>0);
00126 assert(AParallels>0);
00127
00128 CDart * mesh2Corners[2][2];
00129
00130 createTopoMesh2(AMeridians,AParallels, mesh2Corners);
00131 border2TopoSew(alpha1(mesh2Corners[0][0]), alpha1(mesh2Corners[1][0]), AParallels);
00132
00133 if (ABorder1!=NULL) * ABorder1 = mesh2Corners[0][0];
00134 if (ABorder2!=NULL) * ABorder2 = mesh2Corners[0][1];
00135 }
00136
00137 CDart * CGMapGeneric::createTopoTube(int AMeridians, int AParallels)
00138 {
00139 assert(AMeridians>0);
00140 assert(AParallels>0);
00141
00142 CDart * border1;
00143
00144 createTopoTube(AMeridians,AParallels, &border1,NULL);
00145
00146 return border1;
00147 }
00148
00149 void CGMapGeneric::createTopoSphere(int AMeridians, int AParallels,
00150 CDart * * ASouthPole, CDart * * ANorthPole)
00151 {
00152 assert(AMeridians>0);
00153 assert(AParallels>0);
00154
00155 CDart * southPole = createTopoPole(AMeridians);
00156 CDart * northPole = createTopoPole(AMeridians);
00157
00158 if (AParallels==1)
00159 border2TopoSew(alpha01(southPole), alpha01(northPole), AMeridians);
00160 else
00161 {
00162 CDart * top, * bottom;
00163
00164 createTopoTube(AMeridians,AParallels-1, &bottom, &top);
00165
00166 border2TopoSew(alpha01(southPole), bottom, AMeridians);
00167 border2TopoSew(alpha01(northPole), top , AMeridians);
00168 }
00169
00170 if (ASouthPole!=NULL) * ASouthPole = southPole;
00171 if (ANorthPole!=NULL) * ANorthPole = northPole;
00172 }
00173
00174 CDart * CGMapGeneric::createTopoSphere(int AMeridians, int AParallels)
00175 {
00176 assert(AMeridians>0);
00177 assert(AParallels>0);
00178
00179 CDart * southPole;
00180
00181 createTopoSphere(AMeridians,AParallels, &southPole,NULL);
00182
00183 return southPole;
00184 }
00185
00186 void CGMapGeneric::createTopoCylinder(int AMeridians, int AParallels,
00187 CDart * * ABorder1, CDart * * ABorder2,
00188 bool AClose1, bool AClose2)
00189 {
00190 assert(AMeridians>0);
00191 assert(AParallels>0);
00192
00193 CDart * border1;
00194 CDart * border2;
00195
00196 createTopoTube(AMeridians,AParallels, &border1,&border2);
00197
00198 if (AClose1)
00199 border2TopoSew(border1, createTopoPolygon(AMeridians), AMeridians);
00200
00201 if (AClose2)
00202 border2TopoSew(border2, createTopoPolygon(AMeridians), AMeridians);
00203
00204 if (ABorder1!=NULL) * ABorder1 = border1;
00205 if (ABorder2!=NULL) * ABorder2 = border2;
00206 }
00207
00208 CDart * CGMapGeneric::createTopoCylinder(int AMeridians, int AParallels,
00209 bool AClose1, bool AClose2)
00210 {
00211 assert(AMeridians>0);
00212 assert(AParallels>0);
00213
00214 CDart * border1;
00215
00216 createTopoCylinder(AMeridians,AParallels, &border1,NULL, AClose1,AClose2);
00217
00218 return border1;
00219 }
00220
00221 void CGMapGeneric::createTopoPyramid(int AMeridians, int AParallels,
00222 CDart * * ABaseDart, CDart * * APoleDart,
00223 bool ACloseBase)
00224 {
00225 assert(AMeridians>0);
00226 assert(AParallels>0);
00227
00228 CDart * pole = createTopoPole(AMeridians);
00229 CDart * base;
00230
00231 if (AParallels==1)
00232 base = alpha01(pole);
00233 else
00234 {
00235 CDart * top;
00236
00237 createTopoTube(AMeridians, AParallels-1, &base,&top);
00238 border2TopoSew(top, alpha01(pole), AMeridians);
00239 }
00240
00241 if (ACloseBase)
00242 border2TopoSew(base, createTopoPolygon(AMeridians), AMeridians);
00243
00244 if (ABaseDart!=NULL) * ABaseDart = base;
00245 if (APoleDart!=NULL) * APoleDart = pole;
00246 }
00247
00248 CDart * CGMapGeneric::createTopoPyramid(int AMeridians, int AParallels,
00249 bool ACloseBase)
00250 {
00251 assert(AMeridians>0);
00252 assert(AParallels>0);
00253
00254 CDart * baseDart;
00255
00256 createTopoPyramid(AMeridians,AParallels, &baseDart,NULL, ACloseBase);
00257
00258 return baseDart;
00259 }
00260
00261 void CGMapGeneric::createTopoTorus(int AMeridians, int AParallels,
00262 CDart * * AEquator)
00263 {
00264 assert(AMeridians>0);
00265 assert(AParallels>0);
00266
00267 CDart * border1;
00268 CDart * border2;
00269
00270
00271
00272
00273 createTopoTube(AParallels, AMeridians, &border1, &border2);
00274 border2TopoSew(border1, border2, AParallels);
00275
00276 if (AEquator!=NULL) * AEquator = alpha1(border1);
00277 }
00278
00279 CDart * CGMapGeneric::createTopoTorus(int AMeridians, int AParallels)
00280 {
00281 assert(AMeridians>0);
00282 assert(AParallels>0);
00283
00284 CDart * equator;
00285
00286 createTopoTorus(AMeridians,AParallels, &equator);
00287
00288 return equator;
00289 }
00290
00291 void CGMapGeneric::createTopoSquareIMeshed(int ASx, int ASy,
00292 int AMeshDimension,
00293 CDart * ASquareCorners[2][2])
00294 {
00295 assert(ASx>0);
00296 assert(ASy>0);
00297 assert(AMeshDimension>=0 && AMeshDimension<=2);
00298
00299 if (AMeshDimension==0)
00300 ASx = ASy = 1;
00301
00302 if (AMeshDimension==2)
00303 createTopoMesh2(ASx, ASy, ASquareCorners);
00304 else
00305 {
00306 CDart * corners[2];
00307
00308 createTopoMesh1(ASx, corners);
00309 ASquareCorners[0][0] = corners[0];
00310 ASquareCorners[1][0] = corners[1];
00311
00312 createTopoMesh1(ASx, corners);
00313 ASquareCorners[0][1] = corners[0];
00314 ASquareCorners[1][1] = corners[1];
00315
00316 createTopoMesh1(ASy, corners);
00317 linkAlpha1(corners[0], ASquareCorners[0][0]);
00318 linkAlpha1(corners[1], ASquareCorners[0][1]);
00319
00320 createTopoMesh1(ASy, corners);
00321 linkAlpha1(corners[0], ASquareCorners[1][0]);
00322 linkAlpha1(corners[1], ASquareCorners[1][1]);
00323 }
00324 }
00325
00326 void CGMapGeneric::createTopoCubeIMeshed(int ASx, int ASy, int ASz,
00327 int AMeshDimension,
00328 bool ACreatedFaces[3][2],
00329 CDart * AFacesCorners[3][2][2][2])
00330 {
00331 assert(ASx>0);
00332 assert(ASy>0);
00333 assert(ASz>0);
00334 assert(AMeshDimension>=0 && AMeshDimension<=2);
00335 assert(ACreatedFaces!=NULL);
00336 assert(AFacesCorners!=NULL);
00337
00338 if (AMeshDimension==0)
00339 ASx = ASy = ASz = 1;
00340
00341 int dim, dim1, dim2;
00342 int s[3] = {ASx, ASy, ASz};
00343
00344
00345 for (dim=0; dim<3; ++dim)
00346 {
00347 dim1 = (dim+1) % 3;
00348 dim2 = (dim+2) % 3;
00349
00350 for (int side=0; side<2; ++side)
00351 if (ACreatedFaces[dim][side])
00352 createTopoSquareIMeshed(s[dim1], s[dim2],
00353 AMeshDimension, AFacesCorners[dim][side]);
00354 else
00355 for (int n=0; n<4; ++n)
00356 AFacesCorners[dim][side][n/2][n%2] = NULL;
00357 }
00358
00359
00360 for (dim=0; dim<3; ++dim)
00361 {
00362 dim1 = (dim+1) % 3;
00363 dim2 = (dim+2) % 3;
00364
00365 for (int dim1Side=0; dim1Side<2; ++dim1Side)
00366 for (int dim2Side=0; dim2Side<2; ++dim2Side)
00367 if (ACreatedFaces[dim1][dim1Side] && ACreatedFaces[dim2][dim2Side])
00368 {
00369 CDart * dartA = AFacesCorners[dim1][dim1Side][dim2Side][0];
00370 CDart * dartB = AFacesCorners[dim2][dim2Side][0][dim1Side];
00371
00372 border2TopoSew(alpha1(dartA), dartB, s[dim]);
00373 }
00374 }
00375 }
00376