GEL  2
GEL is a library for Geometry and Linear Algebra
/Users/jab/Documents/Teaching/02585/GEL2_and_demos/GEL/src/Geometry/HGrid.h
00001 #ifndef __GEOMETRY_HGRID_H
00002 #define __GEOMETRY_HGRID_H
00003 // Author: J. Andreas Brentzen,
00004 // Created: Wed Jan 24 18:29:0
00005 
00006 #include <vector>
00007 #include "AncestorGrid.h"
00008 #include "Cell.h"
00009 
00010 namespace Geometry 
00011 {
00019         template<class T, class CellT=DefaultCell<T,8> >
00020         class HGrid: public AncestorGrid<T,HGrid<T,CellT> > 
00021         {
00022         public:
00023                 typedef T DataType;             
00024                 typedef CellT CellType;
00025 
00026         private:
00027 
00029                 const CGLA::Vec3i top_dims;
00030 
00032                 std::vector<CellT> top_grid;
00033 
00035                 DataType default_val;
00036                 
00038                 int top_grid_size;
00039 
00040         public:
00041 
00042                 const CGLA::Vec3i& get_top_dims() const {return top_dims;}
00043                 
00044                 int get_bottom_dim() const {return CellT::get_dim();}
00045 
00046                 
00047         private:
00048  
00050                 int get_top_index(const CGLA::Vec3i& idx) const
00051                 {
00052                         const CGLA::Vec3i top_idx = idx/get_bottom_dim();
00053                         return (top_idx[2]*top_dims[1]+top_idx[1])*top_dims[0]+top_idx[0];
00054                 }
00055 
00056         public:
00057 
00059                 HGrid(const CGLA::Vec3i& dims, const T& val = T()):
00060                         AncestorGrid<T,HGrid<T,CellT> >(dims),
00061                         top_dims(dims/CellT::get_dim()+
00062                                                          CGLA::Vec3i(dims[0]%CellT::get_dim()?1:0,
00063                                                                                                          dims[1]%CellT::get_dim()?1:0,
00064                                                                                                          dims[2]%CellT::get_dim()?1:0)),
00065                         top_grid(top_dims[0]*top_dims[1]*top_dims[2],CellT(val)),
00066                         default_val(val), top_grid_size(top_grid.size())
00067                 {}
00068 
00071                 void store(const CGLA::Vec3i& p, const T& vox)
00072                 {
00073                         assert(this->in_domain(p));
00074                         top_grid[get_top_index(p)].store(p, vox);
00075                 }
00076 
00077 
00079                 const T& operator[](const CGLA::Vec3i& p) const
00080                 {
00081                         assert(this->in_domain(p));
00082                         return top_grid[get_top_index(p)][p];
00083                 }
00084 
00085 
00086 //              bool get(const CGLA::Vec3i& p, T* voxel)
00087 //              {
00088 //                      assert(in_domain(p));
00089 //                      CellT* cell = top_grid[get_top_index(p)];
00090 //                      if(cell->is_coalesced()) return false;
00091 //                      voxel = cell[p];
00092 //              }
00093 
00094                 CellT& get_cell(const CGLA::Vec3i& p)
00095                 {
00096                         return top_grid[(p[2]*top_dims[1]+p[1])*top_dims[0]+p[0]];
00097                 }
00098 
00099                 const CellT& get_cell(const CGLA::Vec3i& p) const
00100                 {
00101                         return top_grid[(p[2]*top_dims[1]+p[1])*top_dims[0]+p[0]];
00102                 }
00103 
00104                 CellT& get_cell(int i) 
00105                 {
00106                         return top_grid[i];
00107                 }
00108 
00109                 const CellT& get_cell(int i) const
00110                 {
00111                         return top_grid[i];
00112                 }
00113 
00114                 void clear()
00115                 {
00116                         int N = top_grid.size();
00117                         for(int i=0;i<N;++i)
00118                                 top_grid[i].coalesce(default_val);
00119                 }
00120                 
00121         };
00122 
00123 }
00124 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations