ESyS-Particle  4.0.1
TriMesh.h
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