VTK
vtkAbstractImageInterpolator.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkAbstractImageInterpolator.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
33#ifndef vtkAbstractImageInterpolator_h
34#define vtkAbstractImageInterpolator_h
35
36#include "vtkImagingCoreModule.h" // For export macro
37#include "vtkObject.h"
38
39#define VTK_IMAGE_BORDER_CLAMP 0
40#define VTK_IMAGE_BORDER_REPEAT 1
41#define VTK_IMAGE_BORDER_MIRROR 2
42
43class vtkDataObject;
44class vtkImageData;
45class vtkDataArray;
48
49class VTKIMAGINGCORE_EXPORT vtkAbstractImageInterpolator : public vtkObject
50{
51public:
53 void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
54
59
63 virtual void ReleaseData();
64
70
76 void Update();
77
85 double Interpolate(double x, double y, double z, int component);
86
94 bool Interpolate(const double point[3], double *value);
95
99 void SetOutValue(double outValue);
100 double GetOutValue() { return this->OutValue; }
101
107 void SetTolerance(double tol);
108 double GetTolerance() { return this->Tolerance; }
109
117 int GetComponentOffset() { return this->ComponentOffset; }
118
125 void SetComponentCount(int count);
126 int GetComponentCount() { return this->ComponentCount; }
127
132 int ComputeNumberOfComponents(int inputComponents);
133
140
142
147 void InterpolateIJK(const double point[3], double *value);
148 void InterpolateIJK(const float point[3], float *value);
150
152
158 bool CheckBoundsIJK(const double x[3]);
159 bool CheckBoundsIJK(const float x[3]);
161
163
172 this->SetBorderMode(VTK_IMAGE_BORDER_CLAMP); }
174 this->SetBorderMode(VTK_IMAGE_BORDER_REPEAT); }
176 this->SetBorderMode(VTK_IMAGE_BORDER_MIRROR); }
177 int GetBorderMode() { return this->BorderMode; }
180
187 virtual void ComputeSupportSize(const double matrix[16], int support[3]) = 0;
188
195 virtual bool IsSeparable() = 0;
196
198
209 const double matrix[16], const int extent[6], int checkExtent[6],
210 vtkInterpolationWeights *&weights);
212 const float matrix[16], const int extent[6], int checkExtent[6],
213 vtkInterpolationWeights *&weights);
215
220
222
228 void InterpolateRow(
229 vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx,
230 double *value, int n);
231 void InterpolateRow(
232 vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx,
233 float *value, int n);
235
237
240 vtkGetVector3Macro(Spacing, double);
242
244
247 vtkGetVector3Macro(Origin, double);
249
251
254 vtkGetVector6Macro(Extent, int);
256
258
262 VTK_LEGACY(int *GetWholeExtent());
263 VTK_LEGACY(void GetWholeExtent(int extent[6]));
265
266protected:
269
273 virtual void InternalUpdate() = 0;
274
279
281
285 void (**doublefunc)(
286 vtkInterpolationInfo *, const double [3], double *));
288 void (**floatfunc)(
289 vtkInterpolationInfo *, const float [3], float *));
291
293
297 void (**doublefunc)(
298 vtkInterpolationWeights *, int, int, int, double *, int));
300 void (**floatfunc)(
301 vtkInterpolationWeights *, int, int, int, float *, int));
303
305 double StructuredBoundsDouble[6];
306 float StructuredBoundsFloat[6];
307 int Extent[6];
308 double Spacing[3];
309 double Origin[3];
310 double OutValue;
311 double Tolerance;
315
316 // information needed by the interpolator funcs
318
319 void (*InterpolationFuncDouble)(
320 vtkInterpolationInfo *info, const double point[3], double *outPtr);
321 void (*InterpolationFuncFloat)(
322 vtkInterpolationInfo *info, const float point[3], float *outPtr);
323
324 void (*RowInterpolationFuncDouble)(
325 vtkInterpolationWeights *weights, int idX, int idY, int idZ,
326 double *outPtr, int n);
327 void (*RowInterpolationFuncFloat)(
328 vtkInterpolationWeights *weights, int idX, int idY, int idZ,
329 float *outPtr, int n);
330
331private:
332
334 void operator=(const vtkAbstractImageInterpolator&) VTK_DELETE_FUNCTION;
335};
336
338 const double point[3], double *value)
339{
341}
342
344 const float point[3], float *value)
345{
347}
348
350{
351 double *bounds = this->StructuredBoundsDouble;
352 return !((x[0] < bounds[0]) | (x[0] > bounds[1]) |
353 (x[1] < bounds[2]) | (x[1] > bounds[3]) |
354 (x[2] < bounds[4]) | (x[2] > bounds[5]));
355}
356
358{
359 float *bounds = this->StructuredBoundsFloat;
360 return !((x[0] < bounds[0]) | (x[0] > bounds[1]) |
361 (x[1] < bounds[2]) | (x[1] > bounds[3]) |
362 (x[2] < bounds[4]) | (x[2] > bounds[5]));
363}
364
366 vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx,
367 double *value, int n)
368{
369 this->RowInterpolationFuncDouble(weights, xIdx, yIdx, zIdx, value, n);
370}
371
373 vtkInterpolationWeights *&weights, int xIdx, int yIdx, int zIdx,
374 float *value, int n)
375{
376 this->RowInterpolationFuncFloat(weights, xIdx, yIdx, zIdx, value, n);
377}
378
379#endif
interpolate data values from images
virtual void PrecomputeWeightsForExtent(const float matrix[16], const int extent[6], int checkExtent[6], vtkInterpolationWeights *&weights)
void GetWholeExtent(int extent[6])
void(* InterpolationFuncDouble)(vtkInterpolationInfo *info, const double point[3], double *outPtr)
virtual void ComputeSupportSize(const double matrix[16], int support[3])=0
Get the support size for use in computing update extents.
virtual bool IsSeparable()=0
True if the interpolation is separable, which means that the weights can be precomputed in order to a...
int ComputeNumberOfComponents(int inputComponents)
Compute the number of output components based on the ComponentOffset, ComponentCount,...
void SetComponentCount(int count)
This method specifies the number of components to extract.
int * GetWholeExtent()
Get the whole extent of the data being interpolated, including parts of the data that are not current...
virtual void GetRowInterpolationFunc(void(**floatfunc)(vtkInterpolationWeights *, int, int, int, float *, int))
void SetComponentOffset(int offset)
This method specifies which component of the input will be interpolated, or if ComponentCount is also...
virtual void ReleaseData()
Release any data stored by the interpolator.
virtual void Initialize(vtkDataObject *data)
Initialize the interpolator with the data that you wish to interpolate.
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.
virtual void PrecomputeWeightsForExtent(const double matrix[16], const int extent[6], int checkExtent[6], vtkInterpolationWeights *&weights)
If the data is going to be sampled on a regular grid, then the interpolation weights can be precomput...
double Interpolate(double x, double y, double z, int component)
Get the result of interpolating the specified component of the input data, which should be set to zer...
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 SetOutValue(double outValue)
The value to return when the point is out of bounds.
void(* RowInterpolationFuncDouble)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, double *outPtr, int n)
void(* InterpolationFuncFloat)(vtkInterpolationInfo *info, const float point[3], float *outPtr)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int GetNumberOfComponents()
Get the number of components that will be returned when Interpolate() is called.
virtual void FreePrecomputedWeights(vtkInterpolationWeights *&weights)
Free the weights that were provided by PrecomputeWeightsForExtent.
void DeepCopy(vtkAbstractImageInterpolator *obj)
Copy the interpolator.
virtual void GetRowInterpolationFunc(void(**doublefunc)(vtkInterpolationWeights *, int, int, int, double *, int))
Get the row interpolation functions.
virtual void InternalDeepCopy(vtkAbstractImageInterpolator *obj)=0
Subclass-specific copy.
virtual void GetInterpolationFunc(void(**doublefunc)(vtkInterpolationInfo *, const double[3], double *))
Get the interpolation functions.
void Update()
Update the interpolator.
void(* RowInterpolationFuncFloat)(vtkInterpolationWeights *weights, int idX, int idY, int idZ, float *outPtr, int n)
virtual void InternalUpdate()=0
Subclass-specific updates.
virtual void GetInterpolationFunc(void(**floatfunc)(vtkInterpolationInfo *, const float[3], float *))
void InterpolateIJK(const double point[3], double *value)
A version of Interpolate that takes structured coords instead of data coords.
const char * GetBorderModeAsString()
bool Interpolate(const double point[3], double *value)
Sample the input data.
void SetTolerance(double tol)
The tolerance to apply when checking whether a point is out of bounds.
void SetBorderMode(int mode)
The border mode (default: clamp).
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:55
general representation of visualization data
Definition: vtkDataObject.h:65
topologically and geometrically regular array of data
Definition: vtkImageData.h:46
a simple class to control print indentation
Definition: vtkIndent.h:40
abstract base class for most VTK objects
Definition: vtkObject.h:60
@ component
Definition: vtkX3D.h:175
@ point
Definition: vtkX3D.h:236
@ info
Definition: vtkX3D.h:376
@ mode
Definition: vtkX3D.h:247
@ value
Definition: vtkX3D.h:220
@ extent
Definition: vtkX3D.h:345
@ offset
Definition: vtkX3D.h:438
@ data
Definition: vtkX3D.h:315
#define VTK_IMAGE_BORDER_REPEAT
#define VTK_IMAGE_BORDER_MIRROR
#define VTK_IMAGE_BORDER_CLAMP