TetrahedronSetTopologyContainer.h

Go to the documentation of this file.
00001 /******************************************************************************
00002 *       SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3      *
00003 *                (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS                    *
00004 *                                                                             *
00005 * This library is free software; you can redistribute it and/or modify it     *
00006 * under the terms of the GNU Lesser General Public License as published by    *
00007 * the Free Software Foundation; either version 2.1 of the License, or (at     *
00008 * your option) any later version.                                             *
00009 *                                                                             *
00010 * This library is distributed in the hope that it will be useful, but WITHOUT *
00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
00013 * for more details.                                                           *
00014 *                                                                             *
00015 * You should have received a copy of the GNU Lesser General Public License    *
00016 * along with this library; if not, write to the Free Software Foundation,     *
00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.          *
00018 *******************************************************************************
00019 *                               SOFA :: Modules                               *
00020 *                                                                             *
00021 * Authors: The SOFA Team and external contributors (see Authors.txt)          *
00022 *                                                                             *
00023 * Contact information: contact@sofa-framework.org                             *
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 } // namespace topology
00373 
00374 } // namespace component
00375 
00376 } // namespace sofa
00377 
00378 #endif

Generated on Sun Nov 23 03:46:36 2008 for Sofa by  doxygen 1.5.7.1