00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MESH_OF_TETRA_HPP
00021 #define MESH_OF_TETRA_HPP
00022
00023 #include <Mesh.hpp>
00024 #include <Tetrahedron.hpp>
00025 #include <Connectivity.hpp>
00026 #include <Octree.hpp>
00027
00028 #include <list>
00029 #include <map>
00030
00031 #include <SurfaceMeshOfTriangles.hpp>
00032 #include <FacesSet.hpp>
00033
00043 class MeshOfTetrahedra
00044 : public Mesh
00045 {
00046 public:
00047 typedef Tetrahedron CellType;
00048 typedef Tetrahedron::FaceType FaceType;
00049
00050 typedef MeshOfTetrahedra Transformed;
00051
00052 typedef SurfaceMeshOfTriangles BorderMeshType;
00053
00054 enum {
00055 family = Mesh::volume
00056 };
00057 private:
00058
00059 ReferenceCounting<Vector<Tetrahedron> > __cells;
00061 ReferenceCounting<Octree<size_t, 3> > __octree;
00063 TinyVector<3,real_t> __a;
00064 TinyVector<3,real_t> __b;
00066 ReferenceCounting<BorderMeshType> __borderMesh;
00067 ReferenceCounting<FacesSet<Triangle> > __facesSet;
00069 Connectivity<MeshOfTetrahedra> __connectivity;
00078 MeshOfTetrahedra(const MeshOfTetrahedra& m);
00079
00080 public:
00081 std::string typeName() const
00082 {
00083 return "mesh of tetrahedra";
00084 }
00085
00087 inline bool inside(const real_t& x, const real_t& y, const real_t& z) const
00088 {
00089 return not(this->find(x, y, z).end());
00090
00091 }
00092
00094 inline bool inside(const TinyVector<3>& p) const
00095 {
00096 return this->inside(p[0], p[1], p[2]);
00097 }
00098
00099 bool hasBorderMesh() const
00100 {
00101 return (__borderMesh != 0);
00102 }
00103
00104 ConstReferenceCounting<BorderMeshType> borderMesh() const
00105 {
00106 return __borderMesh;
00107 }
00108
00109 ConstReferenceCounting<Mesh> borderBaseMesh() const
00110 {
00111 return static_cast<const BorderMeshType*>(__borderMesh);
00112 }
00113
00115 inline const size_t& numberOfCells() const
00116 {
00117 return (*__cells).size();
00118 }
00119
00124 void buildEdges();
00125
00131 bool hasFaces() const
00132 {
00133 return (__facesSet != 0);
00134 }
00139 void buildFaces();
00140
00148 const FaceType& face(const size_t& i) const
00149 {
00150 ASSERT(__facesSet != 0);
00151 return (*__facesSet)[i];
00152 }
00153
00155 inline const size_t& numberOfFaces() const
00156 {
00157 ASSERT(__facesSet != 0);
00158 return (*__facesSet).numberOfFaces();
00159 }
00160
00161 size_t cellNumber(const Tetrahedron& h) const
00162 {
00163 return (*__cells).number(h);
00164 }
00165
00166 size_t faceNumber(const FaceType& f) const
00167 {
00168 ASSERT(__facesSet != 0);
00169 return (*__facesSet).number(f);
00170 }
00171
00172 typedef Mesh::T_iterator<MeshOfTetrahedra, Tetrahedron> iterator;
00173 typedef Mesh::T_iterator<const MeshOfTetrahedra, const Tetrahedron> const_iterator;
00174
00175 void buildLocalizationTools();
00176
00186 MeshOfTetrahedra::const_iterator find(const TinyVector<3, real_t>& P) const
00187 {
00188 return find(P[0], P[1], P[2]);
00189 }
00190
00204 MeshOfTetrahedra::const_iterator find(const double& x,
00205 const double& y,
00206 const double& z) const;
00207
00215 inline Tetrahedron& cell(const size_t& i)
00216 {
00217 return (*__cells)[i];
00218 }
00219
00227 inline const Tetrahedron& cell(const size_t& i) const
00228 {
00229 return (*__cells)[i];
00230 }
00231
00237 const Connectivity<MeshOfTetrahedra>& connectivity() const
00238 {
00239 return __connectivity;
00240 }
00241
00247 Connectivity<MeshOfTetrahedra>& connectivity()
00248 {
00249 return __connectivity;
00250 }
00251
00261 MeshOfTetrahedra(ReferenceCounting<VerticesSet> vertices,
00262 ReferenceCounting<VerticesCorrespondance> correspondances,
00263 ReferenceCounting<Vector<Tetrahedron> > tetrahedra,
00264 ReferenceCounting<BorderMeshType> triangles = 0);
00265
00266 ~MeshOfTetrahedra()
00267 {
00268 ;
00269 }
00270 };
00271
00272 #endif // MESH_OF_TETRA_HPP