TetrahedronSetTopologyContainer.h
Go to the documentation of this file.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 #ifndef SOFA_COMPONENT_TOPOLOGY_TETRAHEDRONSETTOPOLOGYCONTAINER_H
00026 #define SOFA_COMPONENT_TOPOLOGY_TETRAHEDRONSETTOPOLOGYCONTAINER_H
00027
00028 #include <sofa/component/topology/TriangleSetTopologyContainer.h>
00029
00030 namespace sofa
00031 {
00032
00033 namespace component
00034 {
00035
00036 namespace topology
00037 {
00038 class TetrahedronSetTopologyModifier;
00039
00040 using core::componentmodel::topology::BaseMeshTopology;
00041
00042 typedef BaseMeshTopology::PointID PointID;
00043 typedef BaseMeshTopology::EdgeID EdgeID;
00044 typedef BaseMeshTopology::TriangleID TriangleID;
00045 typedef BaseMeshTopology::TetraID TetraID;
00046 typedef BaseMeshTopology::Edge Edge;
00047 typedef BaseMeshTopology::Triangle Triangle;
00048 typedef BaseMeshTopology::Tetra Tetra;
00049 typedef BaseMeshTopology::SeqTetras SeqTetras;
00050 typedef BaseMeshTopology::VertexTetras VertexTetras;
00051 typedef BaseMeshTopology::EdgeTetras EdgeTetras;
00052 typedef BaseMeshTopology::TriangleTetras TriangleTetras;
00053 typedef BaseMeshTopology::TetraEdges TetraEdges;
00054 typedef BaseMeshTopology::TetraTriangles TetraTriangles;
00055
00056 typedef Tetra Tetrahedron;
00057 typedef TetraEdges TetrahedronEdges;
00058 typedef TetraTriangles TetrahedronTriangles;
00059
00061 class TetrahedronSetTopologyContainer : public TriangleSetTopologyContainer
00062 {
00063 friend class TetrahedronSetTopologyModifier;
00064
00065 public:
00066 typedef Tetra Tetrahedron;
00067 typedef TetraEdges TetrahedronEdges;
00068 typedef TetraTriangles TetrahedronTriangles;
00069
00070 TetrahedronSetTopologyContainer();
00071
00072 TetrahedronSetTopologyContainer(const sofa::helper::vector< Tetrahedron >& tetrahedra );
00073
00074 virtual ~TetrahedronSetTopologyContainer(){}
00075
00078 virtual void clear();
00079 virtual void addTetra( int a, int b, int c, int d );
00081
00082 virtual void init();
00083
00086
00087 const SeqTetras& getTetras()
00088 {
00089 return getTetrahedronArray();
00090 }
00091
00093 const TetraEdges& getEdgeTetraShell(TetraID i)
00094 {
00095 return getTetrahedronEdges(i);
00096 }
00097
00099 const TetraTriangles& getTriangleTetraShell(TetraID i)
00100 {
00101 return getTetrahedronTriangles(i);
00102 }
00103
00105 const VertexTetras& getTetraVertexShell(PointID i)
00106 {
00107 return getTetrahedronVertexShell(i);
00108 }
00109
00111 const EdgeTetras& getTetraEdgeShell(EdgeID i)
00112 {
00113 return getTetrahedronEdgeShell(i);
00114 }
00115
00117 const TriangleTetras& getTetraTriangleShell(TriangleID i)
00118 {
00119 return getTetrahedronTriangleShell(i);
00120 }
00121
00123 virtual int getTetrahedronIndex(PointID v1, PointID v2, PointID v3, PointID v4);
00124
00128 virtual Edge getLocalTetrahedronEdges (const unsigned int i) const;
00129
00131
00136 virtual bool checkTopology() const;
00137
00141 unsigned int getNumberOfTetrahedra() const;
00142
00146 const sofa::helper::vector<Tetrahedron> &getTetrahedronArray();
00147
00151 const sofa::helper::vector< sofa::helper::vector<unsigned int> > &getTetrahedronVertexShellArray() ;
00152
00156 const sofa::helper::vector< unsigned int > &getTetrahedronVertexShell(const unsigned int i);
00157
00161 const sofa::helper::vector< TetrahedronEdges > &getTetrahedronEdgeArray() ;
00162
00166 const TetrahedronEdges &getTetrahedronEdges(const unsigned int i) ;
00167
00171 const sofa::helper::vector< TetrahedronTriangles > &getTetrahedronTriangleArray() ;
00172
00176 const TetrahedronTriangles &getTetrahedronTriangles(const unsigned int i) ;
00177
00181 const sofa::helper::vector< sofa::helper::vector<unsigned int> > &getTetrahedronEdgeShellArray() ;
00182
00186 const sofa::helper::vector< unsigned int > &getTetrahedronEdgeShell(const unsigned int i) ;
00187
00191 const sofa::helper::vector< sofa::helper::vector<unsigned int> > &getTetrahedronTriangleShellArray() ;
00192
00196 const sofa::helper::vector< unsigned int > &getTetrahedronTriangleShell(const unsigned int i) ;
00197
00199 int getVertexIndexInTetrahedron(const Tetrahedron &t,unsigned int vertexIndex) const;
00200
00202 int getEdgeIndexInTetrahedron(const TetrahedronEdges &t,unsigned int edgeIndex) const;
00203
00205 int getTriangleIndexInTetrahedron(const TetrahedronTriangles &t,unsigned int triangleIndex) const;
00206
00207 inline friend std::ostream& operator<< (std::ostream& out, const TetrahedronSetTopologyContainer& t)
00208 {
00209 out << t.m_tetrahedron<< " "
00210 << t.m_tetrahedronEdge<< " "
00211 << t.m_tetrahedronTriangle;
00212
00213 out << " "<< t.m_tetrahedronVertexShell.size();
00214 for (unsigned int i=0;i<t.m_tetrahedronVertexShell.size();i++)
00215 {
00216 out << " " << t.m_tetrahedronVertexShell[i];
00217 }
00218 out <<" "<< t.m_tetrahedronEdgeShell.size();
00219 for (unsigned int i=0;i<t.m_tetrahedronEdgeShell.size();i++)
00220 {
00221 out << " " << t.m_tetrahedronEdgeShell[i];
00222 }
00223 out <<" "<< t.m_tetrahedronTriangleShell.size();
00224 for (unsigned int i=0;i<t.m_tetrahedronTriangleShell.size();i++)
00225 {
00226 out << " " << t.m_tetrahedronTriangleShell[i];
00227 }
00228 return out;
00229 }
00230
00231 inline friend std::istream& operator>>(std::istream& in, TetrahedronSetTopologyContainer& t)
00232 {
00233 unsigned int s;
00234 sofa::helper::vector< unsigned int > value;
00235
00236
00237 in >> t.m_tetrahedron >> t.m_tetrahedronEdge >> t.m_tetrahedronTriangle;
00238
00239
00240 in >> s;
00241 for (unsigned int i=0;i<s;i++)
00242 {
00243 in >> value;
00244 t.m_tetrahedronVertexShell.push_back(value);
00245 }
00246 in >> s;
00247 for (unsigned int i=0;i<s;i++)
00248 {
00249 in >> value;
00250 t.m_tetrahedronEdgeShell.push_back(value);
00251 }
00252 in >> s;
00253 for (unsigned int i=0;i<s;i++)
00254 {
00255 in >> value;
00256 t.m_tetrahedronTriangleShell.push_back(value);
00257 }
00258 return in;
00259 }
00260
00261 protected:
00266 virtual void createEdgeSetArray();
00267
00272 virtual void createTriangleSetArray();
00273
00278 virtual void createTetrahedronSetArray();
00279
00280 bool hasTetrahedra() const;
00281
00282 bool hasTetrahedronEdges() const;
00283
00284 bool hasTetrahedronTriangles() const;
00285
00286 bool hasTetrahedronVertexShell() const;
00287
00288 bool hasTetrahedronEdgeShell() const;
00289
00290 bool hasTetrahedronTriangleShell() const;
00291
00292 void clearTetrahedra();
00293
00294 void clearTetrahedronEdges();
00295
00296 void clearTetrahedronTriangles();
00297
00298 void clearTetrahedronVertexShell();
00299
00300 void clearTetrahedronEdgeShell();
00301
00302 void clearTetrahedronTriangleShell();
00303
00304 private:
00313 void createTetrahedronEdgeArray();
00314
00320 void createTetrahedronTriangleArray();
00321
00327 void createTetrahedronVertexShellArray();
00328
00334 void createTetrahedronEdgeShellArray();
00335
00341 void createTetrahedronTriangleShellArray();
00342
00346 sofa::helper::vector< unsigned int > &getTetrahedronVertexShellForModification(const unsigned int vertexIndex);
00347
00351 sofa::helper::vector< unsigned int > &getTetrahedronEdgeShellForModification(const unsigned int edgeIndex);
00352
00353
00354 protected:
00356 sofa::helper::vector<Tetrahedron> m_tetrahedron;
00358 sofa::helper::vector<TetrahedronEdges> m_tetrahedronEdge;
00360 sofa::helper::vector<TetrahedronTriangles> m_tetrahedronTriangle;
00361
00363 sofa::helper::vector< sofa::helper::vector< unsigned int > > m_tetrahedronVertexShell;
00365 sofa::helper::vector< sofa::helper::vector< unsigned int > > m_tetrahedronEdgeShell;
00367 sofa::helper::vector< sofa::helper::vector< unsigned int > > m_tetrahedronTriangleShell;
00368
00369 virtual void loadFromMeshLoader(sofa::component::MeshLoader* loader);
00370 };
00371
00372 }
00373
00374 }
00375
00376 }
00377
00378 #endif