00001 #ifndef __SIMPLEX_HPP__
00002 #define __SIMPLEX_HPP__
00003
00004 #include <algorithm>
00005 #include <boost/array.hpp>
00006
00007 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
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 }
00087
00088 #include "Simplex.cpp"
00089
00090 #endif