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
1.5.7.1