TriangleSetTopologyContainer.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_TRIANGLESETTOPOLOGYCONTAINER_H
00026 #define SOFA_COMPONENT_TOPOLOGY_TRIANGLESETTOPOLOGYCONTAINER_H
00027 
00028 #include <sofa/component/topology/EdgeSetTopologyContainer.h>  
00029 
00030 namespace sofa
00031 {
00032 
00033 namespace component
00034 {
00035 
00036 namespace topology
00037 {
00038     class TriangleSetTopologyModifier;
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::Edge              Edge;
00046     typedef BaseMeshTopology::Triangle          Triangle;
00047     typedef BaseMeshTopology::SeqTriangles      SeqTriangles;
00048     typedef BaseMeshTopology::TriangleEdges     TriangleEdges;
00049     typedef BaseMeshTopology::VertexTriangles   VertexTriangles;
00050     typedef BaseMeshTopology::EdgeTriangles     EdgeTriangles;
00051 
00054     class TriangleSetTopologyContainer : public EdgeSetTopologyContainer 
00055     {
00056         friend class TriangleSetTopologyModifier;
00057 
00058     public:
00059 
00060         TriangleSetTopologyContainer();
00061 
00062         TriangleSetTopologyContainer(const sofa::helper::vector< Triangle > &triangles );
00063 
00064         virtual ~TriangleSetTopologyContainer() {}
00065 
00068         virtual void clear();
00069         virtual void addTriangle( int a, int b, int c );
00071 
00072         virtual void init();
00073 
00076 
00077         const SeqTriangles& getTriangles()
00078         {
00079             return getTriangleArray();
00080         }
00081 
00083         virtual int getTriangleIndex(PointID v1, PointID v2, PointID v3);
00084 
00086         const TriangleEdges& getEdgeTriangleShell(TriangleID i)
00087         {
00088             return getTriangleEdge(i);
00089         }
00090 
00094         virtual const VertexTriangles& getTriangleVertexShell(PointID i);
00095 
00096 
00100         virtual const EdgeTriangles& getTriangleEdgeShell(EdgeID i) ;
00101 
00103         virtual int getVertexIndexInTriangle(const Triangle &t, PointID vertexIndex) const;
00104 
00106         virtual int getEdgeIndexInTriangle(const TriangleEdges &t, EdgeID edgeIndex) const;
00107 
00109 
00114         virtual bool checkTopology() const;
00115 
00119         const sofa::helper::vector<Triangle> &getTriangleArray();
00120 
00124         const sofa::helper::vector< sofa::helper::vector<unsigned int> > &getTriangleVertexShellArray();
00125 
00129         const sofa::helper::vector< TriangleEdges > &getTriangleEdgeArray() ;
00130 
00134         const sofa::helper::vector< sofa::helper::vector<unsigned int> > &getTriangleEdgeShellArray() ;
00135 
00139         unsigned int getNumberOfTriangles() const;
00140 
00141 
00145         const TriangleEdges &getTriangleEdge(const unsigned int i) ;
00146 
00147         inline friend std::ostream& operator<< (std::ostream& out, const TriangleSetTopologyContainer& t)
00148         {
00149             out << t.m_triangle.size() << " " << t.m_triangle << " "
00150               << t.m_triangleEdge.size() << " " << t.m_triangleEdge << " "
00151               << t.m_triangleVertexShell.size();
00152             for (unsigned int i=0; i<t.m_triangleVertexShell.size(); i++)
00153             {
00154               out << " " << t.m_triangleVertexShell[i].size();
00155               out << " " <<t.m_triangleVertexShell[i] ;
00156             }
00157             out  << " " << t.m_triangleEdgeShell.size();
00158             for (unsigned int i=0; i<t.m_triangleEdgeShell.size(); i++)
00159             {
00160               out  << " " << t.m_triangleEdgeShell[i].size();
00161               out  << " " << t.m_triangleEdgeShell[i];
00162             }
00163 
00164             return out;
00165         }
00166 
00168         inline friend std::istream& operator>>(std::istream& in, TriangleSetTopologyContainer& t)
00169         {
00170             unsigned int s;
00171             in >> s;
00172             for (unsigned int i=0;i<s;i++) 
00173             {
00174               Triangle T; in >> T;
00175               t.m_triangle.push_back(T);
00176             }
00177             in >> s;
00178             for (unsigned int i=0;i<s;i++) 
00179             {
00180               TriangleEdges T; in >> T;
00181               t.m_triangleEdge.push_back(T);
00182             }
00183 
00184             unsigned int sub;
00185             in >> s;
00186             for (unsigned int i=0;i<s;i++)
00187             {
00188               in >> sub;
00189               sofa::helper::vector< unsigned int > v;
00190               for (unsigned int j=0;j<sub;j++)
00191             {
00192               unsigned int value;
00193               in >> value;
00194               v.push_back(value);
00195             }
00196               t.m_triangleVertexShell.push_back(v);
00197             }
00198 
00199             in >> s;
00200             for (unsigned int i=0;i<s;i++)
00201             {
00202               in >> sub;
00203               sofa::helper::vector< unsigned int > v;
00204               for (unsigned int j=0;j<sub;j++)
00205             {
00206               unsigned int value;
00207               in >> value;
00208               v.push_back(value);
00209             }
00210               t.m_triangleEdgeShell.push_back(v);
00211             }  
00212 
00213                 return in;
00214         }
00215 
00216     protected:
00221         virtual void createTriangleSetArray();
00222 
00227         virtual void createEdgeSetArray();
00228 
00229         bool hasTriangles() const;
00230 
00231         bool hasTriangleEdges() const;
00232 
00233         bool hasTriangleVertexShell() const;
00234 
00235         bool hasTriangleEdgeShell() const;
00236 
00237         void clearTriangles();
00238 
00239         void clearTriangleEdges();
00240 
00241         void clearTriangleVertexShell();
00242 
00243         void clearTriangleEdgeShell();
00244 
00245     private:
00251         void createTriangleEdgeArray();
00257         void createTriangleVertexShellArray();
00258 
00264         void createTriangleEdgeShellArray();
00265 
00269         sofa::helper::vector< unsigned int > &getTriangleVertexShellForModification(const unsigned int vertexIndex); 
00273         sofa::helper::vector< unsigned int > &getTriangleEdgeShellForModification(const unsigned int edgeIndex); 
00274 
00275     protected:
00277         sofa::helper::vector<Triangle> m_triangle;
00279         sofa::helper::vector<TriangleEdges> m_triangleEdge;
00281         sofa::helper::vector< sofa::helper::vector< unsigned int > > m_triangleVertexShell;
00283         sofa::helper::vector< sofa::helper::vector< unsigned int > > m_triangleEdgeShell;       
00284 
00285         virtual void loadFromMeshLoader(sofa::component::MeshLoader* loader);
00286     };
00287 
00288 } // namespace topology
00289 
00290 } // namespace component
00291 
00292 } // namespace sofa
00293 
00294 #endif

Generated on Sun Nov 23 03:47:40 2008 for Sofa by  doxygen 1.5.7.1