elem/Simplex.hpp

00001 #ifndef __SIMPLEX_HPP__
00002 #define __SIMPLEX_HPP__
00003 
00004 #include <algorithm>
00005 #include <boost/array.hpp>
00006 
00007 namespace DAPTA { // Define namespace DAPTA
00008 
00010 
00013 template <typename V, int N>
00014 class Simplex {
00015    public:
00016       typedef V*         VertexHandle;  
00017       
00018       static const int num_vertices = N;
00019       
00020       // No default constructor as the simplex must be setup with vertices as they need to be ordered
00021       Simplex(boost::array<VertexHandle,num_vertices> _vertices) : vertices(_vertices) { ; }
00022       ~Simplex() {;}
00023 
00025       bool operator<(const Simplex<V,N>& f2) const {
00026          return (this->OrderedVertices() < f2.OrderedVertices());
00027       }
00028       
00030       bool operator==(const Simplex<V,N>& f2) const {
00031          return (this->OrderedVertices() == f2.OrderedVertices());
00032       }
00033       
00035       const Simplex<V,N> operator!() const {
00036          Simplex<V,N> ret = *this;
00037          
00038          boost::array<VertexHandle,num_vertices> rev_vertices;
00039          std::reverse_copy(vertices.begin(), vertices.end(), rev_vertices.begin());
00040          
00041          ret.vertices = rev_vertices;
00042          
00043          return ret;
00044       }
00045       
00047       void sort() {
00048          int lowest=0;
00049          for(int i=1; i<num_vertices; i++)
00050             if(vertices.at(i) < vertices.at(lowest))
00051                lowest = i;
00052          
00053          if(lowest != 0) {
00054             boost::array<VertexHandle,num_vertices> ordered_vertices;
00055             for(int i=0; i<num_vertices; i++) {
00056                ordered_vertices.at(i) = vertices.at((i+lowest)%num_vertices);
00057             }
00058             vertices = ordered_vertices;
00059          }
00060       }
00061       
00062       boost::array<VertexHandle,num_vertices> OrderedVertices() const {
00063          if(N < 3) return vertices;
00064          else {
00065             boost::array<VertexHandle,num_vertices> ordered_vertices = vertices;
00066             
00067             int lowest=0;
00068             for(int i=1; i<num_vertices; i++)
00069                if(vertices.at(i) < vertices.at(lowest))
00070                   lowest = i;
00071             
00072             if(lowest != 0) {
00073                for(int i=0; i<num_vertices; i++) {
00074                   ordered_vertices.at(i) = vertices.at((i+lowest)%num_vertices);
00075                }
00076             }
00077             
00078             return ordered_vertices;
00079          }
00080       }
00081       
00082       boost::array<VertexHandle,num_vertices> vertices;
00083    private:
00084 };
00085 
00086 } // namespace DAPTA
00087 
00088 #include "Simplex.cpp"
00089 
00090 #endif

Generated on Tue May 29 17:13:48 2007 for DAPTA by  doxygen 1.5.1