00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MESH_OF_TRIANGLES_HPP
00021 #define MESH_OF_TRIANGLES_HPP
00022
00023 #include <Vector.hpp>
00024 #include <Triangle.hpp>
00025
00026 #include <Mesh.hpp>
00027
00028 #include <Octree.hpp>
00029 #include <Connectivity.hpp>
00030
00031 #include <ErrorHandler.hpp>
00032 #include <EdgesBuilder.hpp>
00033
00044 class MeshOfTriangles
00045 : public Mesh
00046 {
00047 public:
00048 enum {
00049 family = Mesh::plane
00050 };
00051
00052 typedef Triangle CellType;
00053 typedef Edge FaceType;
00054
00055 typedef struct {} BorderMeshType;
00057 typedef Mesh::T_iterator<MeshOfTriangles, Triangle> iterator;
00058 typedef Mesh::T_iterator<const MeshOfTriangles, const Triangle> const_iterator;
00059
00060 private:
00061 ReferenceCounting<Vector<Triangle> > __cells;
00063 ReferenceCounting<Octree<size_t, 2> > __octree;
00064 TinyVector<2,real_t> __a;
00065 TinyVector<2,real_t> __b;
00067 Connectivity<MeshOfTriangles> __connectivity;
00069 public:
00070 bool hasBorderMesh() const
00071 {
00072 return false;
00073 }
00074
00075 ConstReferenceCounting<Mesh> borderBaseMesh() const
00076 {
00077 throw ErrorHandler(__FILE__,__LINE__,
00078 "not implemented yet",
00079 ErrorHandler::unexpected);
00080
00081 return 0;
00082 }
00083
00084 std::string typeName() const
00085 {
00086 return "mesh of triangles";
00087 }
00088
00089 void buildLocalizationTools();
00090
00095 void buildFaces()
00096 {
00097 this->buildEdges();
00098 }
00099
00100 void buildEdges()
00101 {
00102 EdgesBuilder<MeshOfTriangles> edgesBuilder(*this);
00103 __edgesSet = edgesBuilder.edgesSet();
00104 }
00105
00111 const Connectivity<MeshOfTriangles>& connectivity() const
00112 {
00113 return __connectivity;
00114 }
00115
00121 Connectivity<MeshOfTriangles>& connectivity()
00122 {
00123 return __connectivity;
00124 }
00125
00127 inline bool inside(const real_t& x, const real_t& y, const real_t& z) const
00128 {
00129 return not(this->find(x, y, z).end());
00130 }
00131
00133 inline bool inside(const TinyVector<3>& p) const
00134 {
00135 return this->inside(p[0], p[1], p[2]);
00136 }
00137
00147 MeshOfTriangles::const_iterator
00148 find(const TinyVector<3, real_t>& P) const
00149 {
00150 return find(P[0], P[1], P[2]);
00151 }
00152
00166 MeshOfTriangles::const_iterator
00167 find(const double& x,
00168 const double& y,
00169 const double& z) const;
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00188 Triangle& cell(const size_t& i)
00189 {
00190 return (*__cells)[i];
00191 }
00192
00200 const Triangle& cell(const size_t& i) const
00201 {
00202 return (*__cells)[i];
00203 }
00204
00210 inline void setNumberOfCells(const int n)
00211 {
00212 __cells = new Vector<Triangle>(n);
00213 }
00214
00221 inline const size_t& numberOfCells() const
00222 {
00223 return (*__cells).size();
00224 }
00225
00226 size_t cellNumber(const Triangle& t) const
00227 {
00228 return (*__cells).number(t);
00229 }
00230
00236 inline bool hasFaces() const
00237 {
00238 return __edgesSet != 0;
00239 }
00240
00247 inline const size_t& numberOfFaces() const
00248 {
00249 return __edgesSet->numberOfEdges();
00250 }
00251
00259 const FaceType& face(const size_t& i) const
00260 {
00261 return (*__edgesSet)[i];
00262 }
00263
00271 size_t faceNumber(const FaceType& f) const
00272 {
00273 return __edgesSet->number(f);
00274 }
00275
00276 MeshOfTriangles(const size_t& theNumberOfCells)
00277 : Mesh(Mesh::trianglesMesh,
00278 Mesh::plane,
00279 0),
00280 __cells(new Vector<Triangle>(theNumberOfCells)),
00281 __connectivity(*this)
00282 {
00283 ;
00284 }
00285
00286 MeshOfTriangles(ReferenceCounting<VerticesSet> vertices,
00287 ReferenceCounting<VerticesCorrespondance> correspondances,
00288 ReferenceCounting<Vector<Triangle> > triangles);
00289
00294 MeshOfTriangles()
00295 : Mesh(Mesh::trianglesMesh,
00296 Mesh::plane,
00297 0),
00298 __connectivity(*this)
00299 {
00300 ;
00301 }
00302
00307 ~MeshOfTriangles()
00308 {
00309 ;
00310 }
00311 };
00312
00313 #endif // MESH_OF_TRIANGLES_HPP