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 "geometry.hh"
00027 using namespace GMap3d;
00028
00029 #define SUCC(DART) ((((CGMapGeneric*) this)->*succ)(DART))
00030
00031 void CGMapVertex::diveMesh1(CDart * AFirstDart, CMesh1Diver & ADiver,
00032 TEmbedMethod ADiveBorders, int AMeshDimension)
00033 {
00034 assert(1 <= AMeshDimension && AMeshDimension <= 3);
00035
00036 CDart * (CGMapGeneric::* succ) (CDart *) const = NULL;
00037
00038 switch (AMeshDimension)
00039 {
00040 case 1: succ = & CGMapGeneric::alpha01 ; break;
00041 case 2: succ = & CGMapGeneric::alpha0121 ; break;
00042 case 3: succ = & CGMapGeneric::alpha012321; break;
00043 }
00044
00045 CDart * currentX =
00046 ADiveBorders==GMV_NO ? SUCC(AFirstDart) : AFirstDart;
00047
00048 int iMin = ADiveBorders==GMV_NO ? 1 : 0;
00049 int iMax = ADiveBorders==GMV_NO ? ADiver.getSx() - 1 : ADiver.getSx();
00050
00051 for (int i=iMin; i<=iMax; ++i, currentX = SUCC(currentX))
00052 {
00053 ADiver.setIx(i);
00054
00055 if (ADiveBorders==GMV_CHECK && (i==0 || i==ADiver.getSx()))
00056 updateVertex(currentX, ADiver.computeCurrentVertex());
00057 else
00058 setVertex(currentX, ADiver.computeCurrentVertex());
00059 }
00060 }
00061
00062 void CGMapVertex::diveMesh2(CDart * AFirstDart, CMesh2Diver & ADiver,
00063 TEmbedMethod ADiveBorders, int AMeshDimension)
00064 {
00065 assert(2 <= AMeshDimension && AMeshDimension <= 3);
00066
00067 CDart * (CGMapGeneric::* succ) (CDart *) const = NULL;
00068
00069 switch (AMeshDimension)
00070 {
00071 case 2: succ = & CGMapGeneric::alpha0121 ; break;
00072 case 3: succ = & CGMapGeneric::alpha012321; break;
00073 }
00074
00075 CDart * currentY =
00076 ADiveBorders==GMV_NO ? SUCC(alpha1(SUCC(AFirstDart))) : alpha1(AFirstDart);
00077
00078 int iMin = ADiveBorders==GMV_NO ? 1 : 0;
00079 int iMax = ADiveBorders==GMV_NO ? ADiver.getSx() - 1 : ADiver.getSx();
00080
00081 int jMin = ADiveBorders==GMV_NO ? 1 : 0;
00082 int jMax = ADiveBorders==GMV_NO ? ADiver.getSy() - 1 : ADiver.getSy();
00083
00084 for (int j=jMin; j<=jMax;
00085 ++j, currentY = j==jMax ? alpha0(currentY) : SUCC(currentY))
00086 {
00087 ADiver.setIy(j);
00088
00089 bool borderY = j==0 || j==ADiver.getSy();
00090
00091 CDart * currentX = alpha1(currentY);
00092
00093 for (int i=iMin; i<=iMax; ++i, currentX = SUCC(currentX))
00094 {
00095 ADiver.setIx(i);
00096
00097 bool borderX = i==0 || i==ADiver.getSx();
00098
00099 if (ADiveBorders==GMV_CHECK && (borderX || borderY))
00100 updateVertex(currentX, ADiver.computeCurrentVertex());
00101 else
00102 setVertex(currentX, ADiver.computeCurrentVertex());
00103 }
00104 }
00105 }
00106
00107 void CGMapVertex::diveMesh3(CDart * AFirstDart, CMesh3Diver & ADiver,
00108 TEmbedMethod ADiveBorders)
00109 {
00110 CDart * currentZ =
00111 ADiveBorders==GMV_NO
00112 ? alpha210123(alpha101232(alpha012321(AFirstDart)))
00113 : AFirstDart;
00114
00115 currentZ = alpha21(currentZ);
00116
00117 int iMin = ADiveBorders==GMV_NO ? 1 : 0;
00118 int iMax = ADiveBorders==GMV_NO ? ADiver.getSx() - 1 : ADiver.getSx();
00119
00120 int jMin = ADiveBorders==GMV_NO ? 1 : 0;
00121 int jMax = ADiveBorders==GMV_NO ? ADiver.getSy() - 1 : ADiver.getSy();
00122
00123 int kMin = ADiveBorders==GMV_NO ? 1 : 0;
00124 int kMax = ADiveBorders==GMV_NO ? ADiver.getSz() - 1 : ADiver.getSz();
00125
00126 for (int k=kMin; k<=kMax;
00127 ++k, currentZ = k==kMax ? alpha0(currentZ) : alpha012321(currentZ))
00128 {
00129 ADiver.setIz(k);
00130
00131 bool borderZ = k==0 || k==ADiver.getSz();
00132
00133 CDart * currentY = alpha21(currentZ);
00134
00135 for (int j=jMin; j<=jMax;
00136 ++j, currentY = j==jMax ? alpha0(currentY) : alpha012321(currentY))
00137 {
00138 ADiver.setIy(j);
00139
00140 bool borderY = j==0 || j==ADiver.getSy();
00141
00142 CDart * currentX = alpha21(currentY);
00143
00144 for (int i=iMin; i<=iMax;
00145 ++i, currentX = i==iMax ? alpha0(currentX) : alpha012321(currentX))
00146 {
00147 ADiver.setIx(i);
00148
00149 bool borderX = i==0 || i==ADiver.getSx();
00150
00151 if (ADiveBorders==GMV_CHECK && (borderX || borderY || borderZ))
00152 updateVertex(currentX, ADiver.computeCurrentVertex());
00153 else
00154 setVertex(currentX, ADiver.computeCurrentVertex());
00155 }
00156 }
00157 }
00158 }
00159
00160 void CGMapVertex::createMesh1(int ASx, CDart * AMesh1Corners[2],
00161 CMesh1Diver & ADiver)
00162 {
00163 assert(ASx == ADiver.getSx());
00164 assert(AMesh1Corners!=NULL);
00165
00166 createTopoMesh1(ASx, AMesh1Corners);
00167 diveMesh1(AMesh1Corners[0], ADiver);
00168 }
00169
00170 CDart * CGMapVertex::createMesh1(int ASx, CMesh1Diver & ADiver)
00171 {
00172 CDart * mesh1Corners[2];
00173
00174 createMesh1(ASx, mesh1Corners, ADiver);
00175
00176 return mesh1Corners[0];
00177 }
00178
00179 CDart * CGMapVertex::createMesh1(int ASx)
00180 {
00181 CMesh1BasicDiver diver(ASx, -OX/2,OX);
00182 return createMesh1(ASx, diver);
00183 }
00184
00185 void CGMapVertex::createMesh2(int ASx, int ASy,
00186 CDart * AMesh2Corners[2][2],
00187 CMesh2Diver & ADiver)
00188 {
00189 assert(ASx == ADiver.getSx());
00190 assert(ASy == ADiver.getSy());
00191 assert(AMesh2Corners!=NULL);
00192
00193 createTopoMesh2(ASx,ASy, AMesh2Corners);
00194 diveMesh2(AMesh2Corners[0][0], ADiver);
00195 }
00196
00197 CDart * CGMapVertex::createMesh2(int ASx, int ASy, CMesh2Diver & ADiver)
00198 {
00199 CDart * mesh2Corners[2][2];
00200
00201 createMesh2(ASx,ASy, mesh2Corners, ADiver);
00202
00203 return mesh2Corners[0][0];
00204 }
00205
00206 CDart * CGMapVertex::createMesh2(int ASx, int ASy)
00207 {
00208 CMesh2BasicDiver diver(ASx,ASy, -(OX+OY)/2, OX,OY);
00209 return createMesh2(ASx,ASy, diver);
00210 }
00211
00212 void CGMapVertex::createMesh3(int ASx, int ASy, int ASz,
00213 CDart * AMesh3Corners[2][2][2],
00214 CMesh3Diver & ADiver)
00215 {
00216 assert(ASx == ADiver.getSx());
00217 assert(ASy == ADiver.getSy());
00218 assert(ASz == ADiver.getSz());
00219 assert(AMesh3Corners!=NULL);
00220
00221 createTopoMesh3(ASx,ASy,ASz, AMesh3Corners);
00222 diveMesh3(AMesh3Corners[0][0][0], ADiver);
00223 }
00224
00225 CDart * CGMapVertex::createMesh3(int ASx, int ASy, int ASz, CMesh3Diver & ADiver)
00226 {
00227 CDart * mesh3Corners[2][2][2];
00228
00229 createMesh3(ASx,ASy,ASz, mesh3Corners, ADiver);
00230
00231 return mesh3Corners[0][0][0];
00232 }
00233
00234 CDart * CGMapVertex::createMesh3(int ASx, int ASy, int ASz)
00235 {
00236 CMesh3BasicDiver diver(ASx,ASy,ASz, -(OX+OY+OZ)/2, OX,OY,OZ);
00237 return createMesh3(ASx,ASy,ASz, diver);
00238 }
00239
00240 #undef SUCC
00241