ESyS-Particle
4.0.1
|
00001 00002 // // 00003 // Copyright (c) 2003-2011 by The University of Queensland // 00004 // Earth Systems Science Computational Centre (ESSCC) // 00005 // http://www.uq.edu.au/esscc // 00006 // // 00007 // Primary Business: Brisbane, Queensland, Australia // 00008 // Licensed under the Open Software License version 3.0 // 00009 // http://www.opensource.org/licenses/osl-3.0.php // 00010 // // 00012 00013 #ifndef __TRIMESH_H 00014 #define __TRIMESH_H 00015 00016 //--- TML includes --- 00017 #include "tml/comm/comm.h" 00018 00019 // -- Project includes -- 00020 #include "Geometry/Triangle.h" 00021 #include "Geometry/Edge.h" 00022 #include "Geometry/Corner.h" 00023 #include "Model/MeshData.h" 00024 #include "Foundation/vec3.h" 00025 00026 // -- STL includes -- 00027 #include <vector> 00028 #include <map> 00029 #include <string> 00030 00031 using std::vector; 00032 using std::multimap; 00033 using std::map; 00034 using std::string; 00035 00036 // -- IO includes --- 00037 #include <iostream> 00038 00039 using std::ostream; 00040 00041 00050 class TriMesh 00051 { 00052 private: 00053 vector<Triangle> m_triangles; 00054 vector<Edge> m_edges; 00055 vector<Corner> m_corners; 00056 multimap<int,Triangle*> m_triangle_by_node_id; 00057 multimap<int,Edge*> m_edge_by_node_id; 00058 map<int,int> m_corner_by_id; 00059 00060 map<int,int> m_tri_index_by_id; 00061 00062 public: 00063 // types 00064 typedef vector<Triangle>::iterator triangle_iterator; 00065 typedef vector<Edge>::iterator edge_iterator; 00066 typedef vector<Corner>::iterator corner_iterator; 00067 00068 // functions 00069 TriMesh(); 00070 00071 virtual ~TriMesh() 00072 { 00073 } 00074 00075 void LoadMesh(const vector<MeshNodeData>&,const vector<MeshTriData>&); 00076 void moveNode(int,const Vec3&); 00077 void translateBy(const Vec3 &translation); 00078 triangle_iterator triangles_begin(){return m_triangles.begin();}; 00079 triangle_iterator triangles_end(){return m_triangles.end();}; 00080 edge_iterator edges_begin(){return m_edges.begin();}; 00081 edge_iterator edges_end(){return m_edges.end();}; 00082 corner_iterator corners_begin(){return m_corners.begin();}; 00083 corner_iterator corners_end(){return m_corners.end();}; 00084 Triangle* getTriangleById(int); 00085 bool hasMovedBy(double); 00086 void resetCurrentDisplacement(); 00087 00088 void zeroForces(); 00089 virtual void writeCheckPoint(ostream&,const string&) const; 00090 virtual void loadCheckPoint(istream&); 00091 00092 // triangle data access functions 00093 template <typename P> void forAllTrianglesGet(P&,typename P::value_type (Triangle::*rdf)() const); 00094 template <typename P> vector<pair<int,P> > forAllTrianglesGetIndexed(P (Triangle::*rdf)() const); 00095 }; 00096 00097 #include "TriMesh.hpp" 00098 00099 #endif // __TRIMESH_H