GEL
2
GEL is a library for Geometry and Linear Algebra
|
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