VTK  9.3.1
vtkAbstractImageInterpolator.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
21 #ifndef vtkAbstractImageInterpolator_h
22 #define vtkAbstractImageInterpolator_h
23 
24 #include "vtkImagingCoreModule.h" // For export macro
25 #include "vtkObject.h"
26 
28 {
32 };
33 
34 VTK_ABI_NAMESPACE_BEGIN
35 class vtkDataObject;
36 class vtkImageData;
37 class vtkDataArray;
40 
41 class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
42 {
43 public:
45  void PrintSelf(ostream& os, vtkIndent indent) override;
46 
50  virtual void Initialize(vtkDataObject* data);
51 
55  virtual void ReleaseData();
56 
61  void DeepCopy(vtkAbstractImageInterpolator* obj);
62 
68  virtual void Update();
69 
77  double Interpolate(double x, double y, double z, int component);
78 
86  bool Interpolate(const double point[3], double* value);
87 
91  void SetOutValue(double outValue);
92  double GetOutValue() { return this->OutValue; }
93 
99  void SetTolerance(double tol);
100  double GetTolerance() { return this->Tolerance; }
101 
108  void SetComponentOffset(int offset);
109  int GetComponentOffset() { return this->ComponentOffset; }
110 
117  void SetComponentCount(int count);
118  int GetComponentCount() { return this->ComponentCount; }
119 
124  int ComputeNumberOfComponents(int inputComponents);
125 
131  int GetNumberOfComponents();
132 
134 
139  void InterpolateIJK(const double point[3], double* value);
140  void InterpolateIJK(const float point[3], float* value);
142 
144 
150  bool CheckBoundsIJK(const double x[3]);
151  bool CheckBoundsIJK(const float x[3]);
153 
155 
162  void SetBorderMode(vtkImageBorderMode mode);
163  void SetBorderModeToClamp() { this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
164  void SetBorderModeToRepeat() { this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
165  void SetBorderModeToMirror() { this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
166  vtkImageBorderMode GetBorderMode() { return this->BorderMode; }
167  const char* GetBorderModeAsString();
169 
177  void SetSlidingWindow(bool x);
178  void SlidingWindowOn() { this->SetSlidingWindow(true); }
179  void SlidingWindowOff() { this->SetSlidingWindow(false); }
180  bool GetSlidingWindow() { return this->SlidingWindow; }
181 
188  virtual void ComputeSupportSize(const double matrix[16], int support[3]) = 0;
189 
196  virtual bool IsSeparable() = 0;
197 
199 
209  virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6],
210  int checkExtent[6], vtkInterpolationWeights*& weights);
211  virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6],
212  int checkExtent[6], vtkInterpolationWeights*& weights);
214 
218  virtual void FreePrecomputedWeights(vtkInterpolationWeights*& weights);
219 
221 
227  void InterpolateRow(
228  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n);
229  void InterpolateRow(
230  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n);
232 
234 
237  vtkGetVector3Macro(Spacing, double);
239 
241 
244  vtkGetVectorMacro(Direction, double, 9);
246 
248 
251  vtkGetVector3Macro(Origin, double);
253 
255 
258  vtkGetVector6Macro(Extent, int);
260 
261 protected:
263  ~vtkAbstractImageInterpolator() override;
264 
268  virtual void InternalUpdate() = 0;
269 
273  virtual void InternalDeepCopy(vtkAbstractImageInterpolator* obj) = 0;
274 
278  void CoordinateToIJK(const double point[3], double ijk[3]);
279 
281 
284  virtual void GetInterpolationFunc(
285  void (**doublefunc)(vtkInterpolationInfo*, const double[3], double*));
286  virtual void GetInterpolationFunc(
287  void (**floatfunc)(vtkInterpolationInfo*, const float[3], float*));
289 
291 
294  virtual void GetRowInterpolationFunc(
295  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
296  virtual void GetRowInterpolationFunc(
297  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
299 
301 
304  virtual void GetSlidingWindowFunc(
305  void (**doublefunc)(vtkInterpolationWeights*, int, int, int, double*, int));
306  virtual void GetSlidingWindowFunc(
307  void (**floatfunc)(vtkInterpolationWeights*, int, int, int, float*, int));
309 
311  double StructuredBoundsDouble[6];
312  float StructuredBoundsFloat[6];
313  int Extent[6];
314  double Spacing[3];
315  double Direction[9];
316  double InverseDirection[9];
317  double Origin[3];
318  double OutValue;
319  double Tolerance;
325 
326  // information needed by the interpolator funcs
328 
329  void (*InterpolationFuncDouble)(
330  vtkInterpolationInfo* info, const double point[3], double* outPtr);
331  void (*InterpolationFuncFloat)(vtkInterpolationInfo* info, const float point[3], float* outPtr);
332 
333  void (*RowInterpolationFuncDouble)(
334  vtkInterpolationWeights* weights, int idX, int idY, int idZ, double* outPtr, int n);
335  void (*RowInterpolationFuncFloat)(
336  vtkInterpolationWeights* weights, int idX, int idY, int idZ, float* outPtr, int n);
337 
338 private:
340  void operator=(const vtkAbstractImageInterpolator&) = delete;
341 };
342 
343 inline void vtkAbstractImageInterpolator::InterpolateIJK(const double point[3], double* value)
344 {
345  this->InterpolationFuncDouble(this->InterpolationInfo, point, value);
346 }
347 
348 inline void vtkAbstractImageInterpolator::InterpolateIJK(const float point[3], float* value)
349 {
350  this->InterpolationFuncFloat(this->InterpolationInfo, point, value);
351 }
352 
353 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const double x[3])
354 {
355  const double* bounds = this->StructuredBoundsDouble;
356  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
357  (x[2] < bounds[4]) || (x[2] > bounds[5]));
358 }
359 
360 inline bool vtkAbstractImageInterpolator::CheckBoundsIJK(const float x[3])
361 {
362  const float* bounds = this->StructuredBoundsFloat;
363  return !((x[0] < bounds[0]) || (x[0] > bounds[1]) || (x[1] < bounds[2]) || (x[1] > bounds[3]) ||
364  (x[2] < bounds[4]) || (x[2] > bounds[5]));
365 }
366 
368  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, double* value, int n)
369 {
370  this->RowInterpolationFuncDouble(weights, xIdx, yIdx, zIdx, value, n);
371 }
372 
374  vtkInterpolationWeights*& weights, int xIdx, int yIdx, int zIdx, float* value, int n)
375 {
376  this->RowInterpolationFuncFloat(weights, xIdx, yIdx, zIdx, value, n);
377 }
378 
379 VTK_ABI_NAMESPACE_END
380 #endif
interpolate data values from images
abstract base class for most VTK objects
Definition: vtkObject.h:51
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void SetBorderModeToRepeat()
The border mode (default: clamp).
void InterpolateIJK(const double point[3], double *value)
A version of Interpolate that takes structured coords instead of data coords.
a simple class to control print indentation
Definition: vtkIndent.h:28
topologically and geometrically regular array of data
Definition: vtkImageData.h:42
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
vtkImageBorderMode GetBorderMode()
The border mode (default: clamp).
void(* InterpolationFuncFloat)(vtkInterpolationInfo *info, const float point[3], float *outPtr)
void(* RowInterpolationFuncDouble)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, double *outPtr, int n)
bool CheckBoundsIJK(const double x[3])
Check an x,y,z point to see if it is within the bounds for the structured coords of the image...
void(* RowInterpolationFuncFloat)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, float *outPtr, int n)
general representation of visualization data
Definition: vtkDataObject.h:54
void SetBorderModeToClamp()
The border mode (default: clamp).
void InterpolateRow(vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx, double *value, int n)
Get a row of samples, using the weights that were precomputed by PrecomputeWeightsForExtent.
void(* InterpolationFuncDouble)(vtkInterpolationInfo *info, const double point[3], double *outPtr)
void SetBorderModeToMirror()
The border mode (default: clamp).