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-vertex.hh"
00026 #include "mesh-vertex.hh"
00027 #include <cassert>
00028 using namespace GMap3d;
00029
00030 #define A0(DART) (ADirectInfoAlpha0<0 \
00031 ? FMap->alpha0(DART) \
00032 : FMap->getDirectInfoAsDart((DART), ADirectInfoAlpha0))
00033
00034 #define A1(DART) (FMap->alpha1(DART))
00035
00036 #define SUCC(DART) ((((CGMapGeneric*) FMap)->*succ)(DART))
00037
00038 void CMeshVertex::get4ControlPoints(CDart* ADart, CVertex* AVertexArray,
00039 int ADirectInfoAlpha0)
00040 {
00041 assert(ADart!=NULL);
00042 assert(AVertexArray!=NULL);
00043
00044 CDart* dart0 = A0(ADart);
00045
00046 AVertexArray[1] = * FMap->findVertex(ADart);
00047 AVertexArray[2] = * FMap->findVertex(dart0);
00048
00049 if (FMap->isFree2(ADart) &&
00050 FMap->isFree2(A1(ADart)) &&
00051 FMap->isFree2(A1(dart0)))
00052 {
00053
00054 if (FMap->isFree1(ADart))
00055 AVertexArray[0] = AVertexArray[1];
00056 else
00057 AVertexArray[0] = * FMap->findVertex(A0(A1(ADart)));
00058
00059 if (FMap->isFree1(dart0))
00060 AVertexArray[3] = AVertexArray[2];
00061 else
00062 AVertexArray[3] = * FMap->findVertex(A0(A1(dart0)));
00063 }
00064 else if (FMap->isFree3(ADart) &&
00065 FMap->isFree3(FMap->alpha12(ADart)) &&
00066 FMap->isFree3(FMap->alpha12(dart0)))
00067 {
00068
00069 if (FMap->isFree2(A1(ADart)))
00070 AVertexArray[0] = AVertexArray[1];
00071 else
00072 AVertexArray[0] = * FMap->findVertex(A0(FMap->alpha121(ADart)));
00073
00074 if (FMap->isFree2(A1(dart0)))
00075 AVertexArray[3] = AVertexArray[2];
00076 else
00077 AVertexArray[3] = * FMap->findVertex(A0(FMap->alpha121(dart0)));
00078 }
00079 else
00080 {
00081
00082 if (FMap->isFree3(FMap->alpha12(ADart)))
00083 AVertexArray[0] = AVertexArray[1];
00084 else
00085 AVertexArray[0] = * FMap->findVertex(A0(FMap->alpha12321(ADart)));
00086
00087 if (FMap->isFree3(FMap->alpha12(dart0)))
00088 AVertexArray[3] = AVertexArray[1];
00089 else
00090 AVertexArray[3] = * FMap->findVertex(A0(FMap->alpha12321(dart0)));
00091 }
00092 }
00093
00094 void CMeshVertex::get16ControlPoints(CDart* ADart, CVertex** AVertexArray,
00095 int ADirectInfoAlpha0)
00096 {
00097 assert(ADart!=NULL);
00098 assert(AVertexArray!=NULL);
00099
00100 CDart* dart0 = A1(A0(ADart));
00101
00102 ADart = A1(ADart);
00103
00104 if (FMap->isFree3(FMap->alpha12(ADart)) &&
00105 FMap->isFree3(FMap->alpha12(dart0)))
00106 {
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 get4ControlPoints(A1(A0(FMap->alpha21(ADart))), AVertexArray[0], ADirectInfoAlpha0);
00149 get4ControlPoints( ADart , AVertexArray[1], ADirectInfoAlpha0);
00150 get4ControlPoints( dart0 , AVertexArray[2], ADirectInfoAlpha0);
00151 get4ControlPoints(A1(A0(FMap->alpha21(dart0))), AVertexArray[3], ADirectInfoAlpha0);
00152
00153
00154 return;
00155 }
00156
00157
00158 get4ControlPoints(A1(A0(FMap->alpha2321(ADart))), AVertexArray[0], ADirectInfoAlpha0);
00159 get4ControlPoints( ADart , AVertexArray[1], ADirectInfoAlpha0);
00160 get4ControlPoints( dart0 , AVertexArray[2], ADirectInfoAlpha0);
00161 get4ControlPoints(A1(A0(FMap->alpha2321(dart0))), AVertexArray[3], ADirectInfoAlpha0);
00162 }
00163
00164 void CMeshVertex::get64ControlPoints(CDart* ADart, CVertex*** AVertexArray,
00165 int ADirectInfoAlpha0)
00166 {
00167 assert(ADart!=NULL);
00168 assert(AVertexArray!=NULL);
00169
00170 CDart* currentX =
00171 A0(FMap->alpha12321(FMap->alpha1(A0(FMap->alpha2321(FMap->alpha12(A0(FMap->alpha321(ADart))))))));
00172
00173 for (int i=0; i<4; ++i)
00174 {
00175 CDart* currentY = FMap->alpha1(currentX);
00176
00177 for (int j=0; j<4; ++j)
00178 {
00179 CDart* currentZ = FMap->alpha21(currentY);
00180
00181 for (int k=0; k<4; ++k)
00182 {
00183 AVertexArray[i][j][k] = * FMap->findVertex(currentZ);
00184
00185 currentZ = k<3 ? FMap->alpha12321(A0(currentZ)) : A0(currentZ);
00186 }
00187
00188 currentY = j<3 ? FMap->alpha12321(A0(currentY)) : A0(currentY);
00189 }
00190
00191 currentX = i<3 ? FMap->alpha12321(A0(currentX)) : A0(currentX);
00192 }
00193 }
00194
00195 #undef A0
00196 #undef A1
00197
00198 CDart* CMeshVertex::getMesh1Dive(CDart* ADart, int ASx,
00199 const CVertex** AVertexTable,
00200 bool AAlready2MeshedSquare)
00201 {
00202 assert(ADart!=NULL);
00203 assert(AVertexTable!=NULL);
00204 assert(ASx>0);
00205
00206 CDart* currentX = ADart;
00207
00208 CDart* (CGMapGeneric::* succ) (CDart*) const
00209 = AAlready2MeshedSquare ?
00210 & CGMapGeneric::alpha0121 : & CGMapGeneric::alpha01;
00211
00212 for (int i=0; i<=ASx; ++i)
00213 {
00214 assert(FMap->findVertex(currentX) != NULL);
00215
00216 AVertexTable[i] = FMap->findVertex(currentX);
00217
00218 if (i<=ASx-2)
00219 currentX = SUCC(currentX);
00220 else
00221 if (i==ASx-1)
00222 currentX = FMap->alpha0(currentX);
00223 }
00224
00225 return currentX;
00226 }
00227
00228 CDart* CMeshVertex::getMesh2Dive(CDart* ADart, int ASx, int ASy,
00229 const CVertex*** AVertexTable,
00230 bool AAlready3MeshedCube,
00231 int AReturnedDart)
00232 {
00233 assert(ADart!=NULL);
00234 assert(AVertexTable!=NULL);
00235 assert(ASx>0);
00236 assert(ASy>0);
00237 assert(1<=AReturnedDart && AReturnedDart<=3);
00238
00239 CDart* currentX, * currentY=NULL, * returned;
00240
00241 CDart* (CGMapGeneric::* succ) (CDart*) const
00242 = AAlready3MeshedCube ?
00243 & CGMapGeneric::alpha012321 : & CGMapGeneric::alpha0121;
00244
00245 currentX = ADart;
00246
00247 for (int i=0; i<=ASx; ++i)
00248 {
00249 if (i==ASx && AReturnedDart==1)
00250 returned = currentX;
00251
00252 currentY = FMap->alpha1(currentX);
00253
00254 for (int j=0; j<=ASy; ++j)
00255 {
00256 assert(FMap->findVertex(currentY) != NULL);
00257
00258 AVertexTable[i][j] = FMap->findVertex(currentY);
00259
00260 if (j<=ASy-2)
00261 currentY = SUCC(currentY);
00262 else
00263 if (j==ASy-1)
00264 currentY = FMap->alpha0(currentY);
00265 }
00266
00267 if (i==0 && AReturnedDart==2)
00268 returned = FMap->alpha1(currentY);
00269
00270 if (i<=ASx-2)
00271 currentX = SUCC(currentX);
00272 else
00273 if (i==ASx-1)
00274 currentX = FMap->alpha0(currentX);
00275 }
00276
00277 if (AReturnedDart==1)
00278 returned = currentX;
00279 else
00280 returned = FMap->alpha1(currentY);
00281
00282 return returned;
00283 }
00284
00285 #undef SUCC
00286