00001
00002
00003
00004
00005 #ifndef hexsubdiv_hh
00006 #define hexsubdiv_hh
00007
00008 #include <iostream>
00009 #include "strategyChange.hh"
00010 #include "subdivision.hh"
00011
00012 namespace concepts {
00013
00014
00015 class Hexahedron;
00016 class Z2;
00017 class Z4;
00018 class Quad;
00019 class Vertex;
00020
00021
00022
00038 class HexSubdivision : public Subdivision {
00039 public:
00042 virtual void createChildren(Hexahedron& q) const = 0;
00046 virtual void removeChildren(Hexahedron& q) const = 0;
00047 protected:
00049
00065 void subFace0011(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00066 void subFace1100(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00067 void subFace0110(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00068 void subFace1001(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00070
00071
00087 void subFace0123(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00088 Quad*& C, Quad*& D) const;
00089 void subFace1230(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00090 Quad*& C, Quad*& D) const;
00091 void subFace2301(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00092 Quad*& C, Quad*& D) const;
00094
00108 bool faceSubdiv4(Quad& q) const throw(StrategyChange);
00109
00125 Quad* findFace(const Vertex* const v, Quad* const q[4],
00126 const uint tau, const uint rho, const uint vtxIdx) const;
00128
00140 void subdivFace0(Hexahedron& h, Quad*& A, Quad*& B,
00141 Quad*& C, Quad*& D, bool normal) const;
00142 void subdivFace1(Hexahedron& h, Quad*& A, Quad*& B,
00143 Quad*& C, Quad*& D, bool normal) const;
00144 void subdivFace2(Hexahedron& h, Quad*& A, Quad*& B,
00145 Quad*& C, Quad*& D, bool normal) const;
00146 void subdivFace3(Hexahedron& h, Quad*& A, Quad*& B,
00147 Quad*& C, Quad*& D, bool normal) const;
00148 void subdivFace4(Hexahedron& h, Quad*& A, Quad*& B,
00149 Quad*& C, Quad*& D, bool normal) const;
00150 void subdivFace5(Hexahedron& h, Quad*& A, Quad*& B,
00151 Quad*& C, Quad*& D, bool normal) const;
00153 };
00154
00155
00156
00165 class HexSubdiv8 : public HexSubdivision {
00166 public:
00167 virtual void createChildren(Hexahedron& q) const;
00168 virtual void removeChildren(Hexahedron& q) const;
00169 static const HexSubdiv8* instance();
00170 virtual ~HexSubdiv8();
00171 protected:
00172 virtual std::ostream& info(std::ostream& os) const;
00173 private:
00174 static std::auto_ptr<HexSubdiv8> instance_;
00175 };
00176
00177
00178
00187 class HexSubdiv2x : public HexSubdivision {
00188 public:
00189 virtual void createChildren(Hexahedron& q) const;
00190 virtual void removeChildren(Hexahedron& q) const;
00191 static const HexSubdiv2x* instance();
00192 virtual ~HexSubdiv2x();
00193 protected:
00194 virtual std::ostream& info(std::ostream& os) const;
00195 private:
00196 static std::auto_ptr<HexSubdiv2x> instance_;
00197 };
00198
00199
00200
00209 class HexSubdiv2y : public HexSubdivision {
00210 public:
00211 virtual void createChildren(Hexahedron& q) const;
00212 virtual void removeChildren(Hexahedron& q) const;
00213 static const HexSubdiv2y* instance();
00214 virtual ~HexSubdiv2y();
00215 protected:
00216 virtual std::ostream& info(std::ostream& os) const;
00217 private:
00218 static std::auto_ptr<HexSubdiv2y> instance_;
00219 };
00220
00221
00222
00231 class HexSubdiv2z : public HexSubdivision {
00232 public:
00233 virtual void createChildren(Hexahedron& q) const;
00234 virtual void removeChildren(Hexahedron& q) const;
00235 static const HexSubdiv2z* instance();
00236 virtual ~HexSubdiv2z();
00237 protected:
00238 virtual std::ostream& info(std::ostream& os) const;
00239 private:
00240 static std::auto_ptr<HexSubdiv2z> instance_;
00241 };
00242
00243
00244
00253 class HexSubdiv4x : public HexSubdivision {
00254 public:
00255 virtual void createChildren(Hexahedron& q) const;
00256 virtual void removeChildren(Hexahedron& q) const;
00257 static const HexSubdiv4x* instance();
00258 virtual ~HexSubdiv4x();
00259 protected:
00260 virtual std::ostream& info(std::ostream& os) const;
00261 private:
00262 static std::auto_ptr<HexSubdiv4x> instance_;
00263 };
00264
00265
00266
00275 class HexSubdiv4y : public HexSubdivision {
00276 public:
00277 virtual void createChildren(Hexahedron& q) const;
00278 virtual void removeChildren(Hexahedron& q) const;
00279 static const HexSubdiv4y* instance();
00280 virtual ~HexSubdiv4y();
00281 protected:
00282 virtual std::ostream& info(std::ostream& os) const;
00283 private:
00284 static std::auto_ptr<HexSubdiv4y> instance_;
00285 };
00286
00287
00288
00297 class HexSubdiv4z : public HexSubdivision {
00298 public:
00299 virtual void createChildren(Hexahedron& q) const;
00300 virtual void removeChildren(Hexahedron& q) const;
00301 static const HexSubdiv4z* instance();
00302 virtual ~HexSubdiv4z();
00303 protected:
00304 virtual std::ostream& info(std::ostream& os) const;
00305 private:
00306 static std::auto_ptr<HexSubdiv4z> instance_;
00307 };
00308
00309 }
00310
00311 #endif // hexsubdiv_hh