1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
/////////////////////////////////////////////////////////////
// //
// Copyright (c) 2003-2014 by The University of Queensland //
// Centre for Geoscience Computing //
// http://earth.uq.edu.au/centre-geoscience-computing //
// //
// Primary Business: Brisbane, Queensland, Australia //
// Licensed under the Open Software License version 3.0 //
// http://www.apache.org/licenses/LICENSE-2.0 //
// //
/////////////////////////////////////////////////////////////
#ifndef __TRIMESH_H
#define __TRIMESH_H
//--- TML includes ---
#include "tml/comm/comm.h"
// -- Project includes --
#include "Geometry/Triangle.h"
#include "Geometry/Edge.h"
#include "Geometry/Corner.h"
#include "Model/MeshData.h"
#include "Foundation/vec3.h"
// -- STL includes --
#include <vector>
#include <map>
#include <string>
using std::vector;
using std::multimap;
using std::map;
using std::string;
// -- IO includes ---
#include <iostream>
using std::ostream;
/*!
\class TriMesh
\brief class for a triangle mesh
\author Steffen Abe
$Revision$
$Date$
*/
class TriMesh
{
private:
vector<Triangle> m_triangles;
vector<Edge> m_edges;
vector<Corner> m_corners;
multimap<int,Triangle*> m_triangle_by_node_id;
multimap<int,Edge*> m_edge_by_node_id;
map<int,int> m_corner_by_id;
map<int,int> m_tri_index_by_id;
public:
// types
typedef vector<Triangle>::iterator triangle_iterator;
typedef vector<Edge>::iterator edge_iterator;
typedef vector<Corner>::iterator corner_iterator;
// functions
TriMesh();
virtual ~TriMesh()
{
}
void LoadMesh(const vector<MeshNodeData>&,const vector<MeshTriData>&);
void moveNode(int,const Vec3&);
void translateBy(const Vec3 &translation);
triangle_iterator triangles_begin(){return m_triangles.begin();};
triangle_iterator triangles_end(){return m_triangles.end();};
edge_iterator edges_begin(){return m_edges.begin();};
edge_iterator edges_end(){return m_edges.end();};
corner_iterator corners_begin(){return m_corners.begin();};
corner_iterator corners_end(){return m_corners.end();};
Triangle* getTriangleById(int);
bool hasMovedBy(double);
void resetCurrentDisplacement();
void zeroForces();
virtual void writeCheckPoint(ostream&,const string&) const;
virtual void loadCheckPoint(istream&);
// triangle data access functions
template <typename P> void forAllTrianglesGet(P&,typename P::value_type (Triangle::*rdf)() const);
template <typename P> vector<pair<int,P> > forAllTrianglesGetIndexed(P (Triangle::*rdf)() const);
};
#include "TriMesh.hpp"
#endif // __TRIMESH_H
|