aimstil  5.0.5
TensorProductInterpolation.h
Go to the documentation of this file.
1 #ifndef TIL_TENSOR_PRODUCT_INTERPOLATION_H
2 #define TIL_TENSOR_PRODUCT_INTERPOLATION_H
3 
4 // include from STL library
5 #include <cassert>
6 
7 // includes from TIL library
8 #include "til/til_common.h"
9 #include "til/til_declarations.h"
11 
12 
13 // The TensorProductInterpolation class is used to interpolate images
14 // It builds up a tensor interpolation scheme starting from a standard
15 // 1-D interpolation, by interpolating intensity values in the X
16 // direction, then the Y, then the Z.
17 
18 // Example: To use trilinear interpolation:
19 // typedef TensorProductInterpolation<MyImage, LinearInterpolation> TrilinearInterpolation;
20 
21 
22 namespace til {
23 
24 template < typename Interpolation, int TNNeighbors = InterpolationSampleSize<Interpolation>::value >
26 
27 template < typename Interpolation>
28 class TensorProductInterpolation< Interpolation, 2>
29 {
30 public: // typedefs
31 
34 
35 public:
36 
37  template < class Extrapolator, class TImage >
38  INLINE static t_interp computeUnsafe(const TImage &im, const numeric_array<t_interp,3> &pos)
39  { return Self::template computeUnsafe<Extrapolator>(im, EXPAND_VECTOR(pos)); }
40 
41  template < class Extrapolator, class TImage >
42  INLINE static t_interp compute(const TImage &im, const numeric_array<t_interp,3> &pos)
43  { return Self::template compute<Extrapolator>(im, EXPAND_VECTOR(pos)); }
44 
45  template < class Extrapolator, class TImage >
46  INLINE static t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)
47  {
48  int i1, j1, k1;
49  int i2, j2, k2;
50 
51  t_interp dx, dy, dz;
52 
53  dx = x - (i1 = floor(x)); i2 = i1+1;
54  dy = y - (j1 = floor(y)); j2 = j1+1;
55  dz = z - (k1 = floor(z)); k2 = k1+1;
56 
57  typename Iterator<TImage>::ConstVolumetric iIm(im);
58  iIm.setPos(i1, j1, k1);
59 
60  assert(dx>=0); assert(dx<1);
61  assert(dy>=0); assert(dy<1);
62  assert(dz>=0); assert(dz<1);
63 
64  return
65  Interpolation::template compute<t_interp>(
66  Interpolation::template compute<t_interp>(
67  Interpolation::template compute<t_interp>(
68  *iIm,
69  iIm.template getUnsafeValue<Extrapolator, +1, 0, 0>(), dx),
70  Interpolation::template compute<t_interp>(
71  iIm.template getUnsafeValue<Extrapolator, 0,+1, 0>(),
72  iIm.template getUnsafeValue<Extrapolator, +1,+1, 0>(), dx), dy),
73  Interpolation::template compute<t_interp>(
74  Interpolation::template compute<t_interp>(
75  iIm.template getUnsafeValue<Extrapolator, 0, 0,+1>(),
76  iIm.template getUnsafeValue<Extrapolator, +1, 0,+1>(), dx),
77  Interpolation::template compute<t_interp>(
78  iIm.template getUnsafeValue<Extrapolator, 0,+1,+1>(),
79  iIm.template getUnsafeValue<Extrapolator, +1,+1,+1>(), dx), dy), dz);
80  }
81 
82  template < class Extrapolator, class TImage >
83  INLINE static t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
84  {
85  int i1, j1, k1;
86  int i2, j2, k2;
87 
88  t_interp dx, dy, dz;
89 
90  dx = x - (i1 = floor(x)); i2 = i1+1;
91  dy = y - (j1 = floor(y)); j2 = j1+1;
92  dz = z - (k1 = floor(z)); k2 = k1+1;
93 
94  assert(dx>=0); assert(dx<1);
95  assert(dy>=0); assert(dy<1);
96  assert(dz>=0); assert(dz<1);
97 
98  typename Iterator<TImage>::ConstVolumetric iIm(im);
99  iIm.setPos(i1, j1, k1);
100 
101 
102 /* if (contains(getRange(im), Range(i1, j1, k1, i4, j4, k4)))
103  {
104  return <t_interp>Unsafe(im, x, y, z);
105  }
106  else*/
107  {
108  return
109  Interpolation::template compute<t_interp>(
110  Interpolation::template compute<t_interp>(
111  Interpolation::template compute<t_interp>(
112  *iIm,
113  iIm.template getValue<Extrapolator,+1, 0, 0>(), dx),
114  Interpolation::template compute<t_interp>(
115  iIm.template getValue<Extrapolator, 0,+1, 0>(),
116  iIm.template getValue<Extrapolator,+1,+1, 0>(), dx), dy),
117  Interpolation::template compute<t_interp>(
118  Interpolation::template compute<t_interp>(
119  iIm.template getValue<Extrapolator, 0, 0,+1>(),
120  iIm.template getValue<Extrapolator,+1, 0,+1>(), dx),
121  Interpolation::template compute<t_interp>(
122  iIm.template getValue<Extrapolator, 0,+1,+1>(),
123  iIm.template getValue<Extrapolator,+1,+1,+1>(), dx), dy), dz);
124  }
125  }
126 
127 };
128 
129 template < typename Interpolation>
130 class TensorProductInterpolation<Interpolation, 4>
131 {
132 public: // typedefs
133 
136 
137 public:
138 
139  template < class Extrapolator, class TImage >
140  INLINE static t_interp computeUnsafe(const TImage &im, const numeric_array<t_interp,3> &pos)
141  { return Self::template computeUnsafe<Extrapolator>(im, EXPAND_VECTOR(pos)); }
142  template < class Extrapolator, class TImage >
143  INLINE static t_interp compute(const TImage &im, const numeric_array<t_interp,3> &pos)
144  { return Self::template compute<Extrapolator>(im, EXPAND_VECTOR(pos)); }
145 
146  template < class Extrapolator, class TImage >
147  INLINE static t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)
148  {
149  int i1, j1, k1;
150  int i2, j2, k2;
151  int i3, j3, k3;
152  int i4, j4, k4;
153 
154  t_interp dx, dy, dz;
155 
156  dx = x - (i2 = floor(x)); Self::span(i2, i1, i3, i4);
157  dy = y - (j2 = floor(y)); Self::span(j2, j1, j3, j4);
158  dz = z - (k2 = floor(z)); Self::span(k2, k1, k3, k4);
159 
160  assert(dx>=0); assert(dx<1);
161  assert(dy>=0); assert(dy<1);
162  assert(dz>=0); assert(dz<1);
163 
164  typename Iterator<TImage>::ConstVolumetric iIm(im);
165  iIm.setPos(i2, j2, k2);
166 
167 
168  return Interpolation::template compute<t_interp>(
169  Interpolation::template compute<t_interp>(
170  Interpolation::template compute<t_interp>(
171  iIm.template getUnsafeValue<Extrapolator,-1,-1,-1>(),
172  iIm.template getUnsafeValue<Extrapolator, 0,-1,-1>(),
173  iIm.template getUnsafeValue<Extrapolator,+1,-1,-1>(),
174  iIm.template getUnsafeValue<Extrapolator,+2,-1,-1>(), dx),
175  Interpolation::template compute<t_interp>(
176  iIm.template getUnsafeValue<Extrapolator,-1, 0,-1>(),
177  iIm.template getUnsafeValue<Extrapolator, 0, 0,-1>(),
178  iIm.template getUnsafeValue<Extrapolator,+1, 0,-1>(),
179  iIm.template getUnsafeValue<Extrapolator,+2, 0,-1>(), dx),
180  Interpolation::template compute<t_interp>(
181  iIm.template getUnsafeValue<Extrapolator,-1,+1,-1>(),
182  iIm.template getUnsafeValue<Extrapolator, 0,+1,-1>(),
183  iIm.template getUnsafeValue<Extrapolator,+1,+1,-1>(),
184  iIm.template getUnsafeValue<Extrapolator,+2,+1,-1>(), dx),
185  Interpolation::template compute<t_interp>(
186  iIm.template getUnsafeValue<Extrapolator,-1,+2,-1>(),
187  iIm.template getUnsafeValue<Extrapolator, 0,+2,-1>(),
188  iIm.template getUnsafeValue<Extrapolator,+1,+2,-1>(),
189  iIm.template getUnsafeValue<Extrapolator,+2,+2,-1>(), dx), dy),
190  Interpolation::template compute<t_interp>(
191  Interpolation::template compute<t_interp>(
192  iIm.template getUnsafeValue<Extrapolator,-1,-1, 0>(),
193  iIm.template getUnsafeValue<Extrapolator, 0,-1, 0>(),
194  iIm.template getUnsafeValue<Extrapolator,+1,-1, 0>(),
195  iIm.template getUnsafeValue<Extrapolator,+2,-1, 0>(), dx),
196  Interpolation::template compute<t_interp>(
197  iIm.template getUnsafeValue<Extrapolator,-1, 0, 0>(),
198  *iIm,
199  iIm.template getUnsafeValue<Extrapolator,+1, 0, 0>(),
200  iIm.template getUnsafeValue<Extrapolator,+2, 0, 0>(), dx),
201  Interpolation::template compute<t_interp>(
202  iIm.template getUnsafeValue<Extrapolator,-1,+1, 0>(),
203  iIm.template getUnsafeValue<Extrapolator, 0,+1, 0>(),
204  iIm.template getUnsafeValue<Extrapolator,+1,+1, 0>(),
205  iIm.template getUnsafeValue<Extrapolator,+2,+1, 0>(), dx),
206  Interpolation::template compute<t_interp>(
207  iIm.template getUnsafeValue<Extrapolator,-1,+2, 0>(),
208  iIm.template getUnsafeValue<Extrapolator, 0,+2, 0>(),
209  iIm.template getUnsafeValue<Extrapolator,+1,+2, 0>(),
210  iIm.template getUnsafeValue<Extrapolator,+2,+2, 0>(), dx), dy),
211  Interpolation::template compute<t_interp>(
212  Interpolation::template compute<t_interp>(
213  iIm.template getUnsafeValue<Extrapolator,-1,-1,+1>(),
214  iIm.template getUnsafeValue<Extrapolator, 0,-1,+1>(),
215  iIm.template getUnsafeValue<Extrapolator,+1,-1,+1>(),
216  iIm.template getUnsafeValue<Extrapolator,+2,-1,+1>(), dx),
217  Interpolation::template compute<t_interp>(
218  iIm.template getUnsafeValue<Extrapolator,-1, 0,+1>(),
219  iIm.template getUnsafeValue<Extrapolator, 0, 0,+1>(),
220  iIm.template getUnsafeValue<Extrapolator,+1, 0,+1>(),
221  iIm.template getUnsafeValue<Extrapolator,+2, 0,+1>(), dx),
222  Interpolation::template compute<t_interp>(
223  iIm.template getUnsafeValue<Extrapolator,-1,+1,+1>(),
224  iIm.template getUnsafeValue<Extrapolator, 0,+1,+1>(),
225  iIm.template getUnsafeValue<Extrapolator,+1,+1,+1>(),
226  iIm.template getUnsafeValue<Extrapolator,+2,+1,+1>(), dx),
227  Interpolation::template compute<t_interp>(
228  iIm.template getUnsafeValue<Extrapolator,-1,+2,+1>(),
229  iIm.template getUnsafeValue<Extrapolator, 0,+2,+1>(),
230  iIm.template getUnsafeValue<Extrapolator,+1,+2,+1>(),
231  iIm.template getUnsafeValue<Extrapolator,+2,+2,+1>(), dx), dy),
232  Interpolation::template compute<t_interp>(
233  Interpolation::template compute<t_interp>(
234  iIm.template getUnsafeValue<Extrapolator,-1,-1,+2>(),
235  iIm.template getUnsafeValue<Extrapolator, 0,-1,+2>(),
236  iIm.template getUnsafeValue<Extrapolator,+1,-1,+2>(),
237  iIm.template getUnsafeValue<Extrapolator,+2,-1,+2>(), dx),
238  Interpolation::template compute<t_interp>(
239  iIm.template getUnsafeValue<Extrapolator,-1, 0,+2>(),
240  iIm.template getUnsafeValue<Extrapolator, 0, 0,+2>(),
241  iIm.template getUnsafeValue<Extrapolator,+1, 0,+2>(),
242  iIm.template getUnsafeValue<Extrapolator,+2, 0,+2>(), dx),
243  Interpolation::template compute<t_interp>(
244  iIm.template getUnsafeValue<Extrapolator,-1,+1,+2>(),
245  iIm.template getUnsafeValue<Extrapolator, 0,+1,+2>(),
246  iIm.template getUnsafeValue<Extrapolator,+1,+1,+2>(),
247  iIm.template getUnsafeValue<Extrapolator,+2,+1,+2>(), dx),
248  Interpolation::template compute<t_interp>(
249  iIm.template getUnsafeValue<Extrapolator,-1,+2,+2>(),
250  iIm.template getUnsafeValue<Extrapolator, 0,+2,+2>(),
251  iIm.template getUnsafeValue<Extrapolator,+1,+2,+2>(),
252  iIm.template getUnsafeValue<Extrapolator,+2,+2,+2>(), dx), dy), dz);
253  }
254 
255  template < class Extrapolator, class TImage >
256  INLINE static t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
257  {
258  int i1, j1, k1;
259  int i2, j2, k2;
260  int i3, j3, k3;
261  int i4, j4, k4;
262 
263  t_interp dx, dy, dz;
264 
265  dx = x - (i2 = (int)floor(x)); Self::span(i2, i1, i3, i4);
266  dy = y - (j2 = (int)floor(y)); Self::span(j2, j1, j3, j4);
267  dz = z - (k2 = (int)floor(z)); Self::span(k2, k1, k3, k4);
268 
269  assert(dx>=0); assert(dx<1);
270  assert(dy>=0); assert(dy<1);
271  assert(dz>=0); assert(dz<1);
272 
273  typename Iterator<TImage>::ConstVolumetric iIm(im);
274  iIm.set_pos(numeric_array<int,3>(i2, j2, k2));
275 
276  /*
277  std::cout << "i" <<" "<< i1 <<" "<< i2 <<" "<< i3 <<" "<< i4 << std::endl;
278  std::cout << "j" <<" "<< j1 <<" "<< j2 <<" "<< j3 <<" "<< j4 << std::endl;
279  std::cout << "k" <<" "<< k1 <<" "<< k2 <<" "<< k3 <<" "<< k4 << std::endl;
280 */
281 /* if (contains(getRange(im), Range(i1, j1, k1, i4, j4, k4)))
282  {
283  return Self::compute<t_interp>Unsafe(im, x, y, z);
284  }
285  else*/
286  {
287  return
288  Interpolation::template compute<t_interp>(
289  Interpolation::template compute<t_interp>(
290  Interpolation::template compute<t_interp>(
291  iIm.template getValue<Extrapolator,-1,-1,-1>(),
292  iIm.template getValue<Extrapolator, 0,-1,-1>(),
293  iIm.template getValue<Extrapolator,+1,-1,-1>(),
294  iIm.template getValue<Extrapolator,+2,-1,-1>(), dx),
295  Interpolation::template compute<t_interp>(
296  iIm.template getValue<Extrapolator,-1, 0,-1>(),
297  iIm.template getValue<Extrapolator, 0, 0,-1>(),
298  iIm.template getValue<Extrapolator,+1, 0,-1>(),
299  iIm.template getValue<Extrapolator,+2, 0,-1>(), dx),
300  Interpolation::template compute<t_interp>(
301  iIm.template getValue<Extrapolator,-1,+1,-1>(),
302  iIm.template getValue<Extrapolator, 0,+1,-1>(),
303  iIm.template getValue<Extrapolator,+1,+1,-1>(),
304  iIm.template getValue<Extrapolator,+2,+1,-1>(), dx),
305  Interpolation::template compute<t_interp>(
306  iIm.template getValue<Extrapolator,-1,+2,-1>(),
307  iIm.template getValue<Extrapolator, 0,+2,-1>(),
308  iIm.template getValue<Extrapolator,+1,+2,-1>(),
309  iIm.template getValue<Extrapolator,+2,+2,-1>(), dx), dy),
310  Interpolation::template compute<t_interp>(
311  Interpolation::template compute<t_interp>(
312  iIm.template getValue<Extrapolator,-1,-1, 0>(),
313  iIm.template getValue<Extrapolator, 0,-1, 0>(),
314  iIm.template getValue<Extrapolator,+1,-1, 0>(),
315  iIm.template getValue<Extrapolator,+2,-1, 0>(), dx),
316  Interpolation::template compute<t_interp>(
317  iIm.template getValue<Extrapolator,-1, 0, 0>(),
318  *iIm,
319  iIm.template getValue<Extrapolator,+1, 0, 0>(),
320  iIm.template getValue<Extrapolator,+2, 0, 0>(), dx),
321  Interpolation::template compute<t_interp>(
322  iIm.template getValue<Extrapolator,-1,+1, 0>(),
323  iIm.template getValue<Extrapolator, 0,+1, 0>(),
324  iIm.template getValue<Extrapolator,+1,+1, 0>(),
325  iIm.template getValue<Extrapolator,+2,+1, 0>(), dx),
326  Interpolation::template compute<t_interp>(
327  iIm.template getValue<Extrapolator,-1,+2, 0>(),
328  iIm.template getValue<Extrapolator, 0,+2, 0>(),
329  iIm.template getValue<Extrapolator,+1,+2, 0>(),
330  iIm.template getValue<Extrapolator,+2,+2, 0>(), dx), dy),
331  Interpolation::template compute<t_interp>(
332  Interpolation::template compute<t_interp>(
333  iIm.template getValue<Extrapolator,-1,-1,+1>(),
334  iIm.template getValue<Extrapolator, 0,-1,+1>(),
335  iIm.template getValue<Extrapolator,+1,-1,+1>(),
336  iIm.template getValue<Extrapolator,+2,-1,+1>(), dx),
337  Interpolation::template compute<t_interp>(
338  iIm.template getValue<Extrapolator,-1, 0,+1>(),
339  iIm.template getValue<Extrapolator, 0, 0,+1>(),
340  iIm.template getValue<Extrapolator,+1, 0,+1>(),
341  iIm.template getValue<Extrapolator,+2, 0,+1>(), dx),
342  Interpolation::template compute<t_interp>(
343  iIm.template getValue<Extrapolator,-1,+1,+1>(),
344  iIm.template getValue<Extrapolator, 0,+1,+1>(),
345  iIm.template getValue<Extrapolator,+1,+1,+1>(),
346  iIm.template getValue<Extrapolator,+2,+1,+1>(), dx),
347  Interpolation::template compute<t_interp>(
348  iIm.template getValue<Extrapolator,-1,+2,+1>(),
349  iIm.template getValue<Extrapolator, 0,+2,+1>(),
350  iIm.template getValue<Extrapolator,+1,+2,+1>(),
351  iIm.template getValue<Extrapolator,+2,+2,+1>(), dx), dy),
352  Interpolation::template compute<t_interp>(
353  Interpolation::template compute<t_interp>(
354  iIm.template getValue<Extrapolator,-1,-1,+2>(),
355  iIm.template getValue<Extrapolator, 0,-1,+2>(),
356  iIm.template getValue<Extrapolator,+1,-1,+2>(),
357  iIm.template getValue<Extrapolator,+2,-1,+2>(), dx),
358  Interpolation::template compute<t_interp>(
359  iIm.template getValue<Extrapolator,-1, 0,+2>(),
360  iIm.template getValue<Extrapolator, 0, 0,+2>(),
361  iIm.template getValue<Extrapolator,+1, 0,+2>(),
362  iIm.template getValue<Extrapolator,+2, 0,+2>(), dx),
363  Interpolation::template compute<t_interp>(
364  iIm.template getValue<Extrapolator,-1,+1,+2>(),
365  iIm.template getValue<Extrapolator, 0,+1,+2>(),
366  iIm.template getValue<Extrapolator,+1,+1,+2>(),
367  iIm.template getValue<Extrapolator,+2,+1,+2>(), dx),
368  Interpolation::template compute<t_interp>(
369  iIm.template getValue<Extrapolator,-1,+2,+2>(),
370  iIm.template getValue<Extrapolator, 0,+2,+2>(),
371  iIm.template getValue<Extrapolator,+1,+2,+2>(),
372  iIm.template getValue<Extrapolator,+2,+2,+2>(), dx), dy), dz);
373  }
374  }
375 
376 private:
377 
378  INLINE static void span(int i2, int &i1, int &i3, int &i4)
379  {
380  i1 = i2-1;
381  i4 = (i3 = i2 + 1) + 1;
382  }
383 };
384 
385 template < typename Interpolation>
386 class TensorProductInterpolation<Interpolation, 6>
387 {
388 public: // typedefs
389 
392 
393 public:
394 
395  template < class TImage >
396  INLINE static t_interp computeUnsafe(const TImage &im, const numeric_array<t_interp,3> &pos)
397  { return Self::computeUnsafe(im, EXPAND_VECTOR(pos)); }
398  template < class TImage >
399  INLINE static t_interp compute(const TImage &im, const numeric_array<t_interp,3> &pos)
400  { return Self::compute(im, EXPAND_VECTOR(pos)); }
401 
402  template < class TImage >
403  INLINE static t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)
404  {
405  int i1, j1, k1;
406  int i2, j2, k2;
407  int i3, j3, k3;
408  int i4, j4, k4;
409  int i5, j5, k5;
410  int i6, j6, k6;
411 
412  t_interp dx, dy, dz;
413 
414  dx = x - (i3 = floor(x)); Self::span(i3, i1, i2, i4, i5, i6);
415  dy = y - (j3 = floor(y)); Self::span(j3, j1, j2, j4, j5, j6);
416  dz = z - (k3 = floor(z)); Self::span(k3, k1, k2, k4, k5, k6);
417 
418  assert(dx>=0); assert(dx<1);
419  assert(dy>=0); assert(dy<1);
420  assert(dz>=0); assert(dz<1);
421 
422  return Interpolation::template compute<t_interp>(
423  Interpolation::template compute<t_interp>(
424  Interpolation::template compute<t_interp>(
425  im.getUnsafeValue(i1,j1,k1),
426  im.getUnsafeValue(i2,j1,k1),
427  im.getUnsafeValue(i3,j1,k1),
428  im.getUnsafeValue(i4,j1,k1),
429  im.getUnsafeValue(i5,j1,k1),
430  im.getUnsafeValue(i6,j1,k1), dx),
431  Interpolation::template compute<t_interp>(
432  im.getUnsafeValue(i1,j2,k1),
433  im.getUnsafeValue(i2,j2,k1),
434  im.getUnsafeValue(i3,j2,k1),
435  im.getUnsafeValue(i4,j2,k1),
436  im.getUnsafeValue(i5,j2,k1),
437  im.getUnsafeValue(i6,j2,k1), dx),
438  Interpolation::template compute<t_interp>(
439  im.getUnsafeValue(i1,j3,k1),
440  im.getUnsafeValue(i2,j3,k1),
441  im.getUnsafeValue(i3,j3,k1),
442  im.getUnsafeValue(i4,j3,k1),
443  im.getUnsafeValue(i5,j3,k1),
444  im.getUnsafeValue(i6,j3,k1), dx),
445  Interpolation::template compute<t_interp>(
446  im.getUnsafeValue(i1,j4,k1),
447  im.getUnsafeValue(i2,j4,k1),
448  im.getUnsafeValue(i3,j4,k1),
449  im.getUnsafeValue(i4,j4,k1),
450  im.getUnsafeValue(i5,j4,k1),
451  im.getUnsafeValue(i6,j4,k1), dx),
452  Interpolation::template compute<t_interp>(
453  im.getUnsafeValue(i1,j5,k1),
454  im.getUnsafeValue(i2,j5,k1),
455  im.getUnsafeValue(i3,j5,k1),
456  im.getUnsafeValue(i4,j5,k1),
457  im.getUnsafeValue(i5,j5,k1),
458  im.getUnsafeValue(i6,j5,k1), dx),
459  Interpolation::template compute<t_interp>(
460  im.getUnsafeValue(i1,j6,k1),
461  im.getUnsafeValue(i2,j6,k1),
462  im.getUnsafeValue(i3,j6,k1),
463  im.getUnsafeValue(i4,j6,k1),
464  im.getUnsafeValue(i5,j6,k1),
465  im.getUnsafeValue(i6,j6,k1), dx), dy),
466  Interpolation::template compute<t_interp>(
467  Interpolation::template compute<t_interp>(
468  im.getUnsafeValue(i1,j1,k2),
469  im.getUnsafeValue(i2,j1,k2),
470  im.getUnsafeValue(i3,j1,k2),
471  im.getUnsafeValue(i4,j1,k2),
472  im.getUnsafeValue(i5,j1,k2),
473  im.getUnsafeValue(i6,j1,k2), dx),
474  Interpolation::template compute<t_interp>(
475  im.getUnsafeValue(i1,j2,k2),
476  im.getUnsafeValue(i2,j2,k2),
477  im.getUnsafeValue(i3,j2,k2),
478  im.getUnsafeValue(i4,j2,k2),
479  im.getUnsafeValue(i5,j2,k2),
480  im.getUnsafeValue(i6,j2,k2), dx),
481  Interpolation::template compute<t_interp>(
482  im.getUnsafeValue(i1,j3,k2),
483  im.getUnsafeValue(i2,j3,k2),
484  im.getUnsafeValue(i3,j3,k2),
485  im.getUnsafeValue(i4,j3,k2),
486  im.getUnsafeValue(i5,j3,k2),
487  im.getUnsafeValue(i6,j3,k2), dx),
488  Interpolation::template compute<t_interp>(
489  im.getUnsafeValue(i1,j4,k2),
490  im.getUnsafeValue(i2,j4,k2),
491  im.getUnsafeValue(i3,j4,k2),
492  im.getUnsafeValue(i4,j4,k2),
493  im.getUnsafeValue(i5,j4,k2),
494  im.getUnsafeValue(i6,j4,k2), dx),
495  Interpolation::template compute<t_interp>(
496  im.getUnsafeValue(i1,j5,k2),
497  im.getUnsafeValue(i2,j5,k2),
498  im.getUnsafeValue(i3,j5,k2),
499  im.getUnsafeValue(i4,j5,k2),
500  im.getUnsafeValue(i5,j5,k2),
501  im.getUnsafeValue(i6,j5,k2), dx),
502  Interpolation::template compute<t_interp>(
503  im.getUnsafeValue(i1,j6,k2),
504  im.getUnsafeValue(i2,j6,k2),
505  im.getUnsafeValue(i3,j6,k2),
506  im.getUnsafeValue(i4,j6,k2),
507  im.getUnsafeValue(i5,j6,k2),
508  im.getUnsafeValue(i6,j6,k2), dx), dy),
509  Interpolation::template compute<t_interp>(
510  Interpolation::template compute<t_interp>(
511  im.getUnsafeValue(i1,j1,k3),
512  im.getUnsafeValue(i2,j1,k3),
513  im.getUnsafeValue(i3,j1,k3),
514  im.getUnsafeValue(i4,j1,k3),
515  im.getUnsafeValue(i5,j1,k3),
516  im.getUnsafeValue(i6,j1,k3), dx),
517  Interpolation::template compute<t_interp>(
518  im.getUnsafeValue(i1,j2,k3),
519  im.getUnsafeValue(i2,j2,k3),
520  im.getUnsafeValue(i3,j2,k3),
521  im.getUnsafeValue(i4,j2,k3),
522  im.getUnsafeValue(i5,j2,k3),
523  im.getUnsafeValue(i6,j2,k3), dx),
524  Interpolation::template compute<t_interp>(
525  im.getUnsafeValue(i1,j3,k3),
526  im.getUnsafeValue(i2,j3,k3),
527  im.getUnsafeValue(i3,j3,k3),
528  im.getUnsafeValue(i4,j3,k3),
529  im.getUnsafeValue(i5,j3,k3),
530  im.getUnsafeValue(i6,j3,k3), dx),
531  Interpolation::template compute<t_interp>(
532  im.getUnsafeValue(i1,j4,k3),
533  im.getUnsafeValue(i2,j4,k3),
534  im.getUnsafeValue(i3,j4,k3),
535  im.getUnsafeValue(i4,j4,k3),
536  im.getUnsafeValue(i5,j4,k3),
537  im.getUnsafeValue(i6,j4,k3), dx),
538  Interpolation::template compute<t_interp>(
539  im.getUnsafeValue(i1,j5,k3),
540  im.getUnsafeValue(i2,j5,k3),
541  im.getUnsafeValue(i3,j5,k3),
542  im.getUnsafeValue(i4,j5,k3),
543  im.getUnsafeValue(i5,j5,k3),
544  im.getUnsafeValue(i6,j5,k3), dx),
545  Interpolation::template compute<t_interp>(
546  im.getUnsafeValue(i1,j6,k3),
547  im.getUnsafeValue(i2,j6,k3),
548  im.getUnsafeValue(i3,j6,k3),
549  im.getUnsafeValue(i4,j6,k3),
550  im.getUnsafeValue(i5,j6,k3),
551  im.getUnsafeValue(i6,j6,k3), dx), dy),
552  Interpolation::template compute<t_interp>(
553  Interpolation::template compute<t_interp>(
554  im.getUnsafeValue(i1,j1,k4),
555  im.getUnsafeValue(i2,j1,k4),
556  im.getUnsafeValue(i3,j1,k4),
557  im.getUnsafeValue(i4,j1,k4),
558  im.getUnsafeValue(i5,j1,k4),
559  im.getUnsafeValue(i6,j1,k4), dx),
560  Interpolation::template compute<t_interp>(
561  im.getUnsafeValue(i1,j2,k4),
562  im.getUnsafeValue(i2,j2,k4),
563  im.getUnsafeValue(i3,j2,k4),
564  im.getUnsafeValue(i4,j2,k4),
565  im.getUnsafeValue(i5,j2,k4),
566  im.getUnsafeValue(i6,j2,k4), dx),
567  Interpolation::template compute<t_interp>(
568  im.getUnsafeValue(i1,j3,k4),
569  im.getUnsafeValue(i2,j3,k4),
570  im.getUnsafeValue(i3,j3,k4),
571  im.getUnsafeValue(i4,j3,k4),
572  im.getUnsafeValue(i5,j3,k4),
573  im.getUnsafeValue(i6,j3,k4), dx),
574  Interpolation::template compute<t_interp>(
575  im.getUnsafeValue(i1,j4,k4),
576  im.getUnsafeValue(i2,j4,k4),
577  im.getUnsafeValue(i3,j4,k4),
578  im.getUnsafeValue(i4,j4,k4),
579  im.getUnsafeValue(i5,j4,k4),
580  im.getUnsafeValue(i6,j4,k4), dx),
581  Interpolation::template compute<t_interp>(
582  im.getUnsafeValue(i1,j5,k4),
583  im.getUnsafeValue(i2,j5,k4),
584  im.getUnsafeValue(i3,j5,k4),
585  im.getUnsafeValue(i4,j5,k4),
586  im.getUnsafeValue(i5,j5,k4),
587  im.getUnsafeValue(i6,j5,k4), dx),
588  Interpolation::template compute<t_interp>(
589  im.getUnsafeValue(i1,j6,k4),
590  im.getUnsafeValue(i2,j6,k4),
591  im.getUnsafeValue(i3,j6,k4),
592  im.getUnsafeValue(i4,j6,k4),
593  im.getUnsafeValue(i5,j6,k4),
594  im.getUnsafeValue(i6,j6,k4), dx), dy),
595  Interpolation::template compute<t_interp>(
596  Interpolation::template compute<t_interp>(
597  im.getUnsafeValue(i1,j1,k5),
598  im.getUnsafeValue(i2,j1,k5),
599  im.getUnsafeValue(i3,j1,k5),
600  im.getUnsafeValue(i4,j1,k5),
601  im.getUnsafeValue(i5,j1,k5),
602  im.getUnsafeValue(i6,j1,k5), dx),
603  Interpolation::template compute<t_interp>(
604  im.getUnsafeValue(i1,j2,k5),
605  im.getUnsafeValue(i2,j2,k5),
606  im.getUnsafeValue(i3,j2,k5),
607  im.getUnsafeValue(i4,j2,k5),
608  im.getUnsafeValue(i5,j2,k5),
609  im.getUnsafeValue(i6,j2,k5), dx),
610  Interpolation::template compute<t_interp>(
611  im.getUnsafeValue(i1,j3,k5),
612  im.getUnsafeValue(i2,j3,k5),
613  im.getUnsafeValue(i3,j3,k5),
614  im.getUnsafeValue(i4,j3,k5),
615  im.getUnsafeValue(i5,j3,k5),
616  im.getUnsafeValue(i6,j3,k5), dx),
617  Interpolation::template compute<t_interp>(
618  im.getUnsafeValue(i1,j4,k5),
619  im.getUnsafeValue(i2,j4,k5),
620  im.getUnsafeValue(i3,j4,k5),
621  im.getUnsafeValue(i4,j4,k5),
622  im.getUnsafeValue(i5,j4,k5),
623  im.getUnsafeValue(i6,j4,k5), dx),
624  Interpolation::template compute<t_interp>(
625  im.getUnsafeValue(i1,j5,k5),
626  im.getUnsafeValue(i2,j5,k5),
627  im.getUnsafeValue(i3,j5,k5),
628  im.getUnsafeValue(i4,j5,k5),
629  im.getUnsafeValue(i5,j5,k5),
630  im.getUnsafeValue(i6,j5,k5), dx),
631  Interpolation::template compute<t_interp>(
632  im.getUnsafeValue(i1,j6,k5),
633  im.getUnsafeValue(i2,j6,k5),
634  im.getUnsafeValue(i3,j6,k5),
635  im.getUnsafeValue(i4,j6,k5),
636  im.getUnsafeValue(i5,j6,k5),
637  im.getUnsafeValue(i6,j6,k5), dx), dy),
638  Interpolation::template compute<t_interp>(
639  Interpolation::template compute<t_interp>(
640  im.getUnsafeValue(i1,j1,k6),
641  im.getUnsafeValue(i2,j1,k6),
642  im.getUnsafeValue(i3,j1,k6),
643  im.getUnsafeValue(i4,j1,k6),
644  im.getUnsafeValue(i5,j1,k6),
645  im.getUnsafeValue(i6,j1,k6), dx),
646  Interpolation::template compute<t_interp>(
647  im.getUnsafeValue(i1,j2,k6),
648  im.getUnsafeValue(i2,j2,k6),
649  im.getUnsafeValue(i3,j2,k6),
650  im.getUnsafeValue(i4,j2,k6),
651  im.getUnsafeValue(i5,j2,k6),
652  im.getUnsafeValue(i6,j2,k6), dx),
653  Interpolation::template compute<t_interp>(
654  im.getUnsafeValue(i1,j3,k6),
655  im.getUnsafeValue(i2,j3,k6),
656  im.getUnsafeValue(i3,j3,k6),
657  im.getUnsafeValue(i4,j3,k6),
658  im.getUnsafeValue(i5,j3,k6),
659  im.getUnsafeValue(i6,j3,k6), dx),
660  Interpolation::template compute<t_interp>(
661  im.getUnsafeValue(i1,j4,k6),
662  im.getUnsafeValue(i2,j4,k6),
663  im.getUnsafeValue(i3,j4,k6),
664  im.getUnsafeValue(i4,j4,k6),
665  im.getUnsafeValue(i5,j4,k6),
666  im.getUnsafeValue(i6,j4,k6), dx),
667  Interpolation::template compute<t_interp>(
668  im.getUnsafeValue(i1,j5,k6),
669  im.getUnsafeValue(i2,j5,k6),
670  im.getUnsafeValue(i3,j5,k6),
671  im.getUnsafeValue(i4,j5,k6),
672  im.getUnsafeValue(i5,j5,k6),
673  im.getUnsafeValue(i6,j5,k6), dx),
674  Interpolation::template compute<t_interp>(
675  im.getUnsafeValue(i1,j6,k6),
676  im.getUnsafeValue(i2,j6,k6),
677  im.getUnsafeValue(i3,j6,k6),
678  im.getUnsafeValue(i4,j6,k6),
679  im.getUnsafeValue(i5,j6,k6),
680  im.getUnsafeValue(i6,j6,k6), dx), dy), dz);
681  }
682 
683  template < class TImage >
684  INLINE static t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
685  {
686  int i1, j1, k1;
687  int i2, j2, k2;
688  int i3, j3, k3;
689  int i4, j4, k4;
690  int i5, j5, k5;
691  int i6, j6, k6;
692 
693  t_interp dx, dy, dz;
694 
695  dx = x - (i3 = floor(x)); Self::span(i3, i1, i2, i4, i5, i6);
696  dy = y - (j3 = floor(y)); Self::span(j3, j1, j2, j4, j5, j6);
697  dz = z - (k3 = floor(z)); Self::span(k3, k1, k2, k4, k5, k6);
698 
699  assert(dx>=0); assert(dx<1);
700  assert(dy>=0); assert(dy<1);
701  assert(dz>=0); assert(dz<1);
702 
703 
704  /*
705  std::cout << "i" <<" "<< i1 <<" "<< i2 <<" "<< i3 <<" "<< i4 << std::endl;
706  std::cout << "j" <<" "<< j1 <<" "<< j2 <<" "<< j3 <<" "<< j4 << std::endl;
707  std::cout << "k" <<" "<< k1 <<" "<< k2 <<" "<< k3 <<" "<< k4 << std::endl;
708 */
709 /* if (contains(getRange(im), Range(i1, j1, k1, i4, j4, k4)))
710  {
711  return Self::compute<t_interp>Unsafe(im, x, y, z);
712  }
713  else*/
714  {
715 
716  // TODO: obviously, some kind of iteration/loop/recursion is needed here.
717 
718  return Interpolation::template compute<t_interp>(
719  Interpolation::template compute<t_interp>(
720  Interpolation::template compute<t_interp>(
721  im.getValue(i1,j1,k1),
722  im.getValue(i2,j1,k1),
723  im.getValue(i3,j1,k1),
724  im.getValue(i4,j1,k1),
725  im.getValue(i5,j1,k1),
726  im.getValue(i6,j1,k1), dx),
727  Interpolation::template compute<t_interp>(
728  im.getValue(i1,j2,k1),
729  im.getValue(i2,j2,k1),
730  im.getValue(i3,j2,k1),
731  im.getValue(i4,j2,k1),
732  im.getValue(i5,j2,k1),
733  im.getValue(i6,j2,k1), dx),
734  Interpolation::template compute<t_interp>(
735  im.getValue(i1,j3,k1),
736  im.getValue(i2,j3,k1),
737  im.getValue(i3,j3,k1),
738  im.getValue(i4,j3,k1),
739  im.getValue(i5,j3,k1),
740  im.getValue(i6,j3,k1), dx),
741  Interpolation::template compute<t_interp>(
742  im.getValue(i1,j4,k1),
743  im.getValue(i2,j4,k1),
744  im.getValue(i3,j4,k1),
745  im.getValue(i4,j4,k1),
746  im.getValue(i5,j4,k1),
747  im.getValue(i6,j4,k1), dx),
748  Interpolation::template compute<t_interp>(
749  im.getValue(i1,j5,k1),
750  im.getValue(i2,j5,k1),
751  im.getValue(i3,j5,k1),
752  im.getValue(i4,j5,k1),
753  im.getValue(i5,j5,k1),
754  im.getValue(i6,j5,k1), dx),
755  Interpolation::template compute<t_interp>(
756  im.getValue(i1,j6,k1),
757  im.getValue(i2,j6,k1),
758  im.getValue(i3,j6,k1),
759  im.getValue(i4,j6,k1),
760  im.getValue(i5,j6,k1),
761  im.getValue(i6,j6,k1), dx), dy),
762  Interpolation::template compute<t_interp>(
763  Interpolation::template compute<t_interp>(
764  im.getValue(i1,j1,k2),
765  im.getValue(i2,j1,k2),
766  im.getValue(i3,j1,k2),
767  im.getValue(i4,j1,k2),
768  im.getValue(i5,j1,k2),
769  im.getValue(i6,j1,k2), dx),
770  Interpolation::template compute<t_interp>(
771  im.getValue(i1,j2,k2),
772  im.getValue(i2,j2,k2),
773  im.getValue(i3,j2,k2),
774  im.getValue(i4,j2,k2),
775  im.getValue(i5,j2,k2),
776  im.getValue(i6,j2,k2), dx),
777  Interpolation::template compute<t_interp>(
778  im.getValue(i1,j3,k2),
779  im.getValue(i2,j3,k2),
780  im.getValue(i3,j3,k2),
781  im.getValue(i4,j3,k2),
782  im.getValue(i5,j3,k2),
783  im.getValue(i6,j3,k2), dx),
784  Interpolation::template compute<t_interp>(
785  im.getValue(i1,j4,k2),
786  im.getValue(i2,j4,k2),
787  im.getValue(i3,j4,k2),
788  im.getValue(i4,j4,k2),
789  im.getValue(i5,j4,k2),
790  im.getValue(i6,j4,k2), dx),
791  Interpolation::template compute<t_interp>(
792  im.getValue(i1,j5,k2),
793  im.getValue(i2,j5,k2),
794  im.getValue(i3,j5,k2),
795  im.getValue(i4,j5,k2),
796  im.getValue(i5,j5,k2),
797  im.getValue(i6,j5,k2), dx),
798  Interpolation::template compute<t_interp>(
799  im.getValue(i1,j6,k2),
800  im.getValue(i2,j6,k2),
801  im.getValue(i3,j6,k2),
802  im.getValue(i4,j6,k2),
803  im.getValue(i5,j6,k2),
804  im.getValue(i6,j6,k2), dx), dy),
805  Interpolation::template compute<t_interp>(
806  Interpolation::template compute<t_interp>(
807  im.getValue(i1,j1,k3),
808  im.getValue(i2,j1,k3),
809  im.getValue(i3,j1,k3),
810  im.getValue(i4,j1,k3),
811  im.getValue(i5,j1,k3),
812  im.getValue(i6,j1,k3), dx),
813  Interpolation::template compute<t_interp>(
814  im.getValue(i1,j2,k3),
815  im.getValue(i2,j2,k3),
816  im.getValue(i3,j2,k3),
817  im.getValue(i4,j2,k3),
818  im.getValue(i5,j2,k3),
819  im.getValue(i6,j2,k3), dx),
820  Interpolation::template compute<t_interp>(
821  im.getValue(i1,j3,k3),
822  im.getValue(i2,j3,k3),
823  im.getValue(i3,j3,k3),
824  im.getValue(i4,j3,k3),
825  im.getValue(i5,j3,k3),
826  im.getValue(i6,j3,k3), dx),
827  Interpolation::template compute<t_interp>(
828  im.getValue(i1,j4,k3),
829  im.getValue(i2,j4,k3),
830  im.getValue(i3,j4,k3),
831  im.getValue(i4,j4,k3),
832  im.getValue(i5,j4,k3),
833  im.getValue(i6,j4,k3), dx),
834  Interpolation::template compute<t_interp>(
835  im.getValue(i1,j5,k3),
836  im.getValue(i2,j5,k3),
837  im.getValue(i3,j5,k3),
838  im.getValue(i4,j5,k3),
839  im.getValue(i5,j5,k3),
840  im.getValue(i6,j5,k3), dx),
841  Interpolation::template compute<t_interp>(
842  im.getValue(i1,j6,k3),
843  im.getValue(i2,j6,k3),
844  im.getValue(i3,j6,k3),
845  im.getValue(i4,j6,k3),
846  im.getValue(i5,j6,k3),
847  im.getValue(i6,j6,k3), dx), dy),
848  Interpolation::template compute<t_interp>(
849  Interpolation::template compute<t_interp>(
850  im.getValue(i1,j1,k4),
851  im.getValue(i2,j1,k4),
852  im.getValue(i3,j1,k4),
853  im.getValue(i4,j1,k4),
854  im.getValue(i5,j1,k4),
855  im.getValue(i6,j1,k4), dx),
856  Interpolation::template compute<t_interp>(
857  im.getValue(i1,j2,k4),
858  im.getValue(i2,j2,k4),
859  im.getValue(i3,j2,k4),
860  im.getValue(i4,j2,k4),
861  im.getValue(i5,j2,k4),
862  im.getValue(i6,j2,k4), dx),
863  Interpolation::template compute<t_interp>(
864  im.getValue(i1,j3,k4),
865  im.getValue(i2,j3,k4),
866  im.getValue(i3,j3,k4),
867  im.getValue(i4,j3,k4),
868  im.getValue(i5,j3,k4),
869  im.getValue(i6,j3,k4), dx),
870  Interpolation::template compute<t_interp>(
871  im.getValue(i1,j4,k4),
872  im.getValue(i2,j4,k4),
873  im.getValue(i3,j4,k4),
874  im.getValue(i4,j4,k4),
875  im.getValue(i5,j4,k4),
876  im.getValue(i6,j4,k4), dx),
877  Interpolation::template compute<t_interp>(
878  im.getValue(i1,j5,k4),
879  im.getValue(i2,j5,k4),
880  im.getValue(i3,j5,k4),
881  im.getValue(i4,j5,k4),
882  im.getValue(i5,j5,k4),
883  im.getValue(i6,j5,k4), dx),
884  Interpolation::template compute<t_interp>(
885  im.getValue(i1,j6,k4),
886  im.getValue(i2,j6,k4),
887  im.getValue(i3,j6,k4),
888  im.getValue(i4,j6,k4),
889  im.getValue(i5,j6,k4),
890  im.getValue(i6,j6,k4), dx), dy),
891  Interpolation::template compute<t_interp>(
892  Interpolation::template compute<t_interp>(
893  im.getValue(i1,j1,k5),
894  im.getValue(i2,j1,k5),
895  im.getValue(i3,j1,k5),
896  im.getValue(i4,j1,k5),
897  im.getValue(i5,j1,k5),
898  im.getValue(i6,j1,k5), dx),
899  Interpolation::template compute<t_interp>(
900  im.getValue(i1,j2,k5),
901  im.getValue(i2,j2,k5),
902  im.getValue(i3,j2,k5),
903  im.getValue(i4,j2,k5),
904  im.getValue(i5,j2,k5),
905  im.getValue(i6,j2,k5), dx),
906  Interpolation::template compute<t_interp>(
907  im.getValue(i1,j3,k5),
908  im.getValue(i2,j3,k5),
909  im.getValue(i3,j3,k5),
910  im.getValue(i4,j3,k5),
911  im.getValue(i5,j3,k5),
912  im.getValue(i6,j3,k5), dx),
913  Interpolation::template compute<t_interp>(
914  im.getValue(i1,j4,k5),
915  im.getValue(i2,j4,k5),
916  im.getValue(i3,j4,k5),
917  im.getValue(i4,j4,k5),
918  im.getValue(i5,j4,k5),
919  im.getValue(i6,j4,k5), dx),
920  Interpolation::template compute<t_interp>(
921  im.getValue(i1,j5,k5),
922  im.getValue(i2,j5,k5),
923  im.getValue(i3,j5,k5),
924  im.getValue(i4,j5,k5),
925  im.getValue(i5,j5,k5),
926  im.getValue(i6,j5,k5), dx),
927  Interpolation::template compute<t_interp>(
928  im.getValue(i1,j6,k5),
929  im.getValue(i2,j6,k5),
930  im.getValue(i3,j6,k5),
931  im.getValue(i4,j6,k5),
932  im.getValue(i5,j6,k5),
933  im.getValue(i6,j6,k5), dx), dy),
934  Interpolation::template compute<t_interp>(
935  Interpolation::template compute<t_interp>(
936  im.getValue(i1,j1,k6),
937  im.getValue(i2,j1,k6),
938  im.getValue(i3,j1,k6),
939  im.getValue(i4,j1,k6),
940  im.getValue(i5,j1,k6),
941  im.getValue(i6,j1,k6), dx),
942  Interpolation::template compute<t_interp>(
943  im.getValue(i1,j2,k6),
944  im.getValue(i2,j2,k6),
945  im.getValue(i3,j2,k6),
946  im.getValue(i4,j2,k6),
947  im.getValue(i5,j2,k6),
948  im.getValue(i6,j2,k6), dx),
949  Interpolation::template compute<t_interp>(
950  im.getValue(i1,j3,k6),
951  im.getValue(i2,j3,k6),
952  im.getValue(i3,j3,k6),
953  im.getValue(i4,j3,k6),
954  im.getValue(i5,j3,k6),
955  im.getValue(i6,j3,k6), dx),
956  Interpolation::template compute<t_interp>(
957  im.getValue(i1,j4,k6),
958  im.getValue(i2,j4,k6),
959  im.getValue(i3,j4,k6),
960  im.getValue(i4,j4,k6),
961  im.getValue(i5,j4,k6),
962  im.getValue(i6,j4,k6), dx),
963  Interpolation::template compute<t_interp>(
964  im.getValue(i1,j5,k6),
965  im.getValue(i2,j5,k6),
966  im.getValue(i3,j5,k6),
967  im.getValue(i4,j5,k6),
968  im.getValue(i5,j5,k6),
969  im.getValue(i6,j5,k6), dx),
970  Interpolation::template compute<t_interp>(
971  im.getValue(i1,j6,k6),
972  im.getValue(i2,j6,k6),
973  im.getValue(i3,j6,k6),
974  im.getValue(i4,j6,k6),
975  im.getValue(i5,j6,k6),
976  im.getValue(i6,j6,k6), dx), dy), dz);
977  }
978  }
979 
980 private:
981 
982  INLINE static void span(int i3, int &i1, int &i2, int &i4, int &i5, int &i6)
983  {
984  i1 = (i2 = i3 - 1) - 1;
985  i6 = (i5 = (i4 = i3 + 1) + 1) +1;
986  }
987 };
988 
989 
990 
991 } // namespace
992 
993 #endif
994 
A trait class to assign iterators to image types.
static INLINE t_interp compute(const TImage &im, const numeric_array< t_interp, 3 > &pos)
static INLINE t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
#define EXPAND_VECTOR(v)
Definition: til_common.h:54
static INLINE t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
Belongs to package Box Do not include directly, include til/Box.h instead.
Definition: Accumulator.h:10
static INLINE t_interp computeUnsafe(const TImage &im, const numeric_array< t_interp, 3 > &pos)
General macros, definitions and functions.
static INLINE t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)
static INLINE t_interp computeUnsafe(const TImage &im, const numeric_array< t_interp, 3 > &pos)
TensorProductInterpolation< Interpolation, 6 > Self
This file contains forward declarations of classes defined in the TIL library.
static INLINE t_interp computeUnsafe(const TImage &im, const numeric_array< t_interp, 3 > &pos)
#define INLINE
Definition: til_common.h:26
TensorProductInterpolation< Interpolation, 4 > Self
static INLINE t_interp compute(const TImage &im, const numeric_array< t_interp, 3 > &pos)
static INLINE t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)
static INLINE t_interp compute(const TImage &im, const numeric_array< t_interp, 3 > &pos)
double t_interp
static INLINE t_interp compute(const TImage &im, t_interp x, t_interp y, t_interp z)
TensorProductInterpolation< Interpolation, 2 > Self
static INLINE t_interp computeUnsafe(const TImage &im, t_interp x, t_interp y, t_interp z)