SVolume.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <ionMath.h>
5 #include "Interpolation.h"
6 
7 
8 namespace ion
9 {
10 
11  template <typename T>
12  struct SVolume
13  {
14  vector<T> Values;
16 
17  SVolume(vec3i const & dimensions = vec3i())
18  : Dimensions(dimensions), Values()
19  {
20  Allocate();
21  }
22 
23  SVolume(T const & init, vec3i const & dimensions = vec3i())
24  : Dimensions(dimensions), Values()
25  {
26  Allocate(init);
27  }
28 
29  virtual void Allocate()
30  {
31  Values.resize(Dimensions.X * Dimensions.Y * Dimensions.Z);
32  }
33 
34  virtual void Allocate(T const & value)
35  {
36  Values.resize(Dimensions.X * Dimensions.Y * Dimensions.Z, value);
37  }
38 
39  virtual bool const InBounds(vec3i const Index) const
40  {
41  return InBounds(Index.X, Index.Y, Index.Z);
42  }
43 
44  virtual bool const InBounds(int const X, int const Y, int const Z) const
45  {
46  return X >= 0 && X < Dimensions.X &&
47  Y >= 0 && Y < Dimensions.Y &&
48  Z >= 0 && Z < Dimensions.Z;
49  }
50 
51  virtual T & Get(vec3i const Index)
52  {
53  return Get(Index.X, Index.Y, Index.Z);
54  }
55 
56  virtual T const & Get(vec3i const Index) const
57  {
58  return Get(Index.X, Index.Y, Index.Z);
59  }
60 
61  virtual T & Get(int const X, int const Y, int const Z)
62  {
63  int const Index = Clamp(X, 0, Dimensions.X - 1) + Dimensions.X * Clamp(Y, 0, Dimensions.Y - 1) + Dimensions.X * Dimensions.Y * Clamp(Z, 0, Dimensions.Z - 1);
64  return Values[Index];
65  }
66 
67  virtual T const & Get(int const X, int const Y, int const Z) const
68  {
69  int const Index = Clamp(X, 0, Dimensions.X - 1) + Dimensions.X * Clamp(Y, 0, Dimensions.Y - 1) + Dimensions.X * Dimensions.Y * Clamp(Z, 0, Dimensions.Z - 1);
70  return Values[Index];
71  }
72 
73  T const & GetTricubicInterpolated(float const X, float const Y, float const Z) const
74  {
75  int const iX = (int) X, iY = (int) Y, iZ = (int) Z;
76  float const dX = X - floor(X), dY = Y - floor(Y), dZ = Z - floor(Z);
77  T Values[4][4][4];
78 
79  for (int i = 0; i < 4; ++ i)
80  for (int j = 0; j < 4; ++ j)
81  for (int k = 0; k < 4; ++ k)
82  {
83  Values[i][j][k] = Get(iX - 1 + i, iY - 1 + j, iZ - 1 + k);
84  }
85 
86  return TricubicInterpolate(Values, dX, dY, dZ);
87  }
88 
89  template <typename U>
90  T const & GetTricubicInterpolatedMember(float const X, float const Y, float const Z, U T:: *Member) const
91  {
92  int const iX = (int) X, iY = (int) Y, iZ = (int) Z;
93  float const dX = X - floor(X), dY = Y - floor(Y), dZ = Z - floor(Z);
94  T Values[4][4][4];
95 
96  for (int i = 0; i < 4; ++ i)
97  for (int j = 0; j < 4; ++ j)
98  for (int k = 0; k < 4; ++ k)
99  {
100  Values[i][j][k] = Get(iX - 1 + i, iY - 1 + j, iZ - 1 + k).*Member;
101  }
102 
103  return TricubicInterpolate(Values, dX, dY, dZ);
104  }
105 
107  {
108  SVolume<T> & Volume;
109  int const X, Y;
110 
111  friend struct SVolume<T>;
112 
113  SRowAccess(SVolume<T> & volume, int const xIndex, int const yIndex)
114  : Volume(volume), X(xIndex), Y(yIndex)
115  {}
116 
117  public:
118 
119  T & operator[] (int const Z)
120  {
121  return Volume.Get(X, Y, Z);
122  }
123 
124  };
125 
127  {
128  SVolume<T> const & Volume;
129  int const X, Y;
130 
131  friend struct SVolume<T>;
132 
133  SConstRowAccess(SVolume<T> const & volume, int const xIndex, int const yIndex)
134  : Volume(volume), X(xIndex), Y(yIndex)
135  {}
136 
137  public:
138 
139  T const & operator[] (int const Z) const
140  {
141  return Volume.Get(X, Y, Z);
142  }
143 
144  };
145 
147  {
148  SVolume<T> & Volume;
149  int const X;
150 
151  friend struct SVolume<T>;
152 
153  SLayerAccess(SVolume<T> & volume, int const index)
154  : Volume(volume), X(index)
155  {}
156 
157  public:
158 
159  SRowAccess operator[] (int const Y)
160  {
161  return SRowAccess(Volume, X, Y);
162  }
163 
164  };
165 
167  {
168  SVolume<T> const & Volume;
169  int const X;
170 
171  friend struct SVolume<T>;
172 
173  SConstLayerAccess(SVolume<T> const & volume, int const index)
174  : Volume(volume), X(index)
175  {}
176 
177  public:
178 
179  SConstRowAccess operator[] (int const Y) const
180  {
181  return SConstRowAccess(Volume, X, Y);
182  }
183 
184  };
185 
186  virtual SLayerAccess operator[] (int const X)
187  {
188  return SLayerAccess(* this, X);
189  }
190 
191  virtual SConstLayerAccess operator[] (int const X) const
192  {
193  return SConstLayerAccess(* this, X);
194  }
195 
196  virtual T & operator[] (vec3i const & index)
197  {
198  return Get(index.X, index.Y, index.Z);
199  }
200 
201  virtual T & operator[] (glm::ivec3 const & index)
202  {
203  return Get(index.x, index.y, index.z);
204  }
205 
206  virtual T const & operator[] (vec3i const & index) const
207  {
208  return Get(index.X, index.Y, index.Z);
209  }
210 
211  virtual T const & operator[] (glm::ivec3 const & index) const
212  {
213  return Get(index.x, index.y, index.z);
214  }
215 
216  typedef typename std::vector<T>::iterator iterator;
217  typedef typename std::vector<T>::const_iterator const_iterator;
218 
219  virtual iterator begin()
220  {
221  return Values.begin();
222  }
223 
224  virtual iterator end()
225  {
226  return Values.end();
227  }
228 
229  virtual const_iterator begin() const
230  {
231  return Values.begin();
232  }
233 
234  virtual const_iterator end() const
235  {
236  return Values.end();
237  }
238  };
239 
240 }
virtual iterator begin()
Definition: SVolume.h:219
vector< T > Values
Definition: SVolume.h:14
virtual const_iterator begin() const
Definition: SVolume.h:229
std::vector< T >::const_iterator const_iterator
Definition: SVolume.h:217
virtual bool const InBounds(int const X, int const Y, int const Z) const
Definition: SVolume.h:44
std::vector< T >::iterator iterator
Definition: SVolume.h:216
virtual void Allocate()
Definition: SVolume.h:29
virtual void Allocate(T const &value)
Definition: SVolume.h:34
virtual bool const InBounds(vec3i const Index) const
Definition: SVolume.h:39
T const & GetTricubicInterpolatedMember(float const X, float const Y, float const Z, U T::*Member) const
Definition: SVolume.h:90
vec3< int > vec3i
Definition: vec3.h:640
T Z
Definition: vec3.h:20
T X
Definition: vec3.h:18
Definition: CCatmullRomAdvancedSplineInterpolator.h:7
virtual T const & Get(int const X, int const Y, int const Z) const
Definition: SVolume.h:67
virtual T & Get(vec3i const Index)
Definition: SVolume.h:51
T TricubicInterpolate(T p[4][4][4], T x, T y, T z)
Definition: Interpolation.h:55
vec3i Dimensions
Definition: SVolume.h:15
SVolume(T const &init, vec3i const &dimensions=vec3i())
Definition: SVolume.h:23
virtual const_iterator end() const
Definition: SVolume.h:234
Definition: SVolume.h:166
virtual T & Get(int const X, int const Y, int const Z)
Definition: SVolume.h:61
virtual iterator end()
Definition: SVolume.h:224
Definition: SVolume.h:12
virtual T const & Get(vec3i const Index) const
Definition: SVolume.h:56
T Clamp(T const v, T const min, T const max)
Definition: ionUtils.h:45
Definition: SVolume.h:106
T & operator[](int const Z)
Definition: SVolume.h:119
Definition: SVolume.h:126
T const & GetTricubicInterpolated(float const X, float const Y, float const Z) const
Definition: SVolume.h:73
SVolume(vec3i const &dimensions=vec3i())
Definition: SVolume.h:17
Definition: SVolume.h:146
T Y
Definition: vec3.h:19