You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
315 lines
10 KiB
C
315 lines
10 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkPointInterpolator.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkPointInterpolator
|
||
|
* @brief interpolate over point cloud using various kernels
|
||
|
*
|
||
|
*
|
||
|
* vtkPointInterpolator probes a point cloud Pc (the filter Source) with a
|
||
|
* set of points P (the filter Input), interpolating the data values from Pc
|
||
|
* onto P. Note however that the descriptive phrase "point cloud" is a
|
||
|
* misnomer: Pc can be represented by any vtkDataSet type, with the points of
|
||
|
* the dataset forming Pc. Similarly, the output P can also be represented by
|
||
|
* any vtkDataSet type; and the topology/geometry structure of P is passed
|
||
|
* through to the output along with the newly interpolated arrays.
|
||
|
*
|
||
|
* A key input to this filter is the specification of the interpolation
|
||
|
* kernel, and the parameters which control the associated interpolation
|
||
|
* process. Interpolation kernels include Voronoi, Gaussian, Shepard, and SPH
|
||
|
* (smoothed particle hydrodynamics), with additional kernels to be added in
|
||
|
* the future.
|
||
|
*
|
||
|
* An overview of the algorithm is as follows. For each p from P, Np "close"
|
||
|
* points to p are found. (The meaning of what is "close" can be specified as
|
||
|
* either the N closest points, or all points within a given radius Rp. This
|
||
|
* depends on how the kernel is defined.) Once the Np close points are found,
|
||
|
* then the interpolation kernel is applied to compute new data values
|
||
|
* located on p. Note that for reasonable performance, finding the Np closest
|
||
|
* points requires a point locator. The locator may be specified as input to
|
||
|
* the algorithm. (By default, a vtkStaticPointLocator is used because
|
||
|
* generally it is much faster to build, delete, and search with. However,
|
||
|
* with highly non-uniform point distributions, octree- or kd-tree based
|
||
|
* locators may perform better.)
|
||
|
*
|
||
|
* @warning
|
||
|
* This class has been threaded with vtkSMPTools. Using TBB or other
|
||
|
* non-sequential type (set in the CMake variable
|
||
|
* VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
|
||
|
*
|
||
|
* @warning
|
||
|
* For widely spaced points in Pc, or when p is located outside the bounding
|
||
|
* region of Pc, the interpolation may behave badly and the interpolation
|
||
|
* process will adapt as necessary to produce output. For example, if the N
|
||
|
* closest points within R are requested to interpolate p, if N=0 then the
|
||
|
* interpolation will switch to a different strategy (which can be controlled
|
||
|
* as in the NullPointsStrategy).
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkPointInterpolator2D vtkProbeFilter vtkGaussianSplatter
|
||
|
* vtkCheckerboardSplatter vtkShepardMethod vtkVoronoiKernel vtkShepardKernel
|
||
|
* vtkGaussianKernel vtkSPHKernel
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkPointInterpolator_h
|
||
|
#define vtkPointInterpolator_h
|
||
|
|
||
|
#include "vtkDataSetAlgorithm.h"
|
||
|
#include "vtkFiltersPointsModule.h" // For export macro
|
||
|
#include "vtkStdString.h" // For vtkStdString ivars
|
||
|
#include <vector> //For STL vector
|
||
|
|
||
|
class vtkAbstractPointLocator;
|
||
|
class vtkIdList;
|
||
|
class vtkDoubleArray;
|
||
|
class vtkInterpolationKernel;
|
||
|
class vtkCharArray;
|
||
|
|
||
|
class VTKFILTERSPOINTS_EXPORT vtkPointInterpolator : public vtkDataSetAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
//@{
|
||
|
/**
|
||
|
* Standard methods for instantiating, obtaining type information, and
|
||
|
* printing.
|
||
|
*/
|
||
|
static vtkPointInterpolator* New();
|
||
|
vtkTypeMacro(vtkPointInterpolator, vtkDataSetAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify the dataset Pc that will be probed by the input points P. The
|
||
|
* Input P defines the dataset structure (the points and cells) for the
|
||
|
* output, while the Source Pc is probed (interpolated) to generate the
|
||
|
* scalars, vectors, etc. for the output points based on the point
|
||
|
* locations.
|
||
|
*/
|
||
|
void SetSourceData(vtkDataObject* source);
|
||
|
vtkDataObject* GetSource();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Specify the dataset Pc that will be probed by the input points P. The
|
||
|
* Input P defines the structure (the points and cells) for the output,
|
||
|
* while the Source Pc is probed (interpolated) to generate the scalars,
|
||
|
* vectors, etc. for the output points based on the point locations.
|
||
|
*/
|
||
|
void SetSourceConnection(vtkAlgorithmOutput* algOutput);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify a point locator. By default a vtkStaticPointLocator is
|
||
|
* used. The locator performs efficient searches to locate near a
|
||
|
* specified interpolation position.
|
||
|
*/
|
||
|
void SetLocator(vtkAbstractPointLocator* locator);
|
||
|
vtkGetObjectMacro(Locator, vtkAbstractPointLocator);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify an interpolation kernel. By default a vtkLinearKernel is used
|
||
|
* (i.e., linear combination of closest points). The interpolation kernel
|
||
|
* changes the basis of the interpolation.
|
||
|
*/
|
||
|
void SetKernel(vtkInterpolationKernel* kernel);
|
||
|
vtkGetObjectMacro(Kernel, vtkInterpolationKernel);
|
||
|
//@}
|
||
|
|
||
|
enum Strategy
|
||
|
{
|
||
|
MASK_POINTS = 0,
|
||
|
NULL_VALUE = 1,
|
||
|
CLOSEST_POINT = 2
|
||
|
};
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify a strategy to use when encountering a "null" point during the
|
||
|
* interpolation process. Null points occur when the local neighborhood (of
|
||
|
* nearby points to interpolate from) is empty. If the strategy is set to
|
||
|
* MaskPoints, then an output array is created that marks points as being
|
||
|
* valid (=1) or null (invalid =0) (and the NullValue is set as well). If
|
||
|
* the strategy is set to NullValue (this is the default), then the output
|
||
|
* data value(s) are set to the NullPoint value (specified in the output
|
||
|
* point data). Finally, the strategy ClosestPoint is to simply use the
|
||
|
* closest point to perform the interpolation.
|
||
|
*/
|
||
|
vtkSetMacro(NullPointsStrategy, int);
|
||
|
vtkGetMacro(NullPointsStrategy, int);
|
||
|
void SetNullPointsStrategyToMaskPoints() { this->SetNullPointsStrategy(MASK_POINTS); }
|
||
|
void SetNullPointsStrategyToNullValue() { this->SetNullPointsStrategy(NULL_VALUE); }
|
||
|
void SetNullPointsStrategyToClosestPoint() { this->SetNullPointsStrategy(CLOSEST_POINT); }
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If the NullPointsStrategy == MASK_POINTS, then an array is generated for
|
||
|
* each input point. This vtkCharArray is placed into the output of the filter,
|
||
|
* with a non-zero value for a valid point, and zero otherwise. The name of
|
||
|
* this masking array is specified here.
|
||
|
*/
|
||
|
vtkSetMacro(ValidPointsMaskArrayName, vtkStdString);
|
||
|
vtkGetMacro(ValidPointsMaskArrayName, vtkStdString);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify the null point value. When a null point is encountered then all
|
||
|
* components of each null tuple are set to this value. By default the
|
||
|
* null value is set to zero.
|
||
|
*/
|
||
|
vtkSetMacro(NullValue, double);
|
||
|
vtkGetMacro(NullValue, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Adds an array to the list of arrays which are to be excluded from the
|
||
|
* interpolation process.
|
||
|
*/
|
||
|
void AddExcludedArray(const vtkStdString& excludedArray)
|
||
|
{
|
||
|
this->ExcludedArrays.push_back(excludedArray);
|
||
|
this->Modified();
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Clears the contents of excluded array list.
|
||
|
*/
|
||
|
void ClearExcludedArrays()
|
||
|
{
|
||
|
this->ExcludedArrays.clear();
|
||
|
this->Modified();
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return the number of excluded arrays.
|
||
|
*/
|
||
|
int GetNumberOfExcludedArrays() { return static_cast<int>(this->ExcludedArrays.size()); }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Return the name of the ith excluded array.
|
||
|
*/
|
||
|
const char* GetExcludedArray(int i)
|
||
|
{
|
||
|
if (i < 0 || i >= static_cast<int>(this->ExcludedArrays.size()))
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
return this->ExcludedArrays[i].c_str();
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If enabled, then input arrays that are non-real types (i.e., not float
|
||
|
* or double) are promoted to float type on output. This is because the
|
||
|
* interpolation process may not be well behaved when integral types are
|
||
|
* combined using interpolation weights.
|
||
|
*/
|
||
|
vtkSetMacro(PromoteOutputArrays, bool);
|
||
|
vtkBooleanMacro(PromoteOutputArrays, bool);
|
||
|
vtkGetMacro(PromoteOutputArrays, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Indicate whether to shallow copy the input point data arrays to the
|
||
|
* output. On by default.
|
||
|
*/
|
||
|
vtkSetMacro(PassPointArrays, bool);
|
||
|
vtkBooleanMacro(PassPointArrays, bool);
|
||
|
vtkGetMacro(PassPointArrays, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Indicate whether to shallow copy the input cell data arrays to the
|
||
|
* output. On by default.
|
||
|
*/
|
||
|
vtkSetMacro(PassCellArrays, bool);
|
||
|
vtkBooleanMacro(PassCellArrays, bool);
|
||
|
vtkGetMacro(PassCellArrays, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Indicate whether to pass the field-data arrays from the input to the
|
||
|
* output. On by default.
|
||
|
*/
|
||
|
vtkSetMacro(PassFieldArrays, bool);
|
||
|
vtkBooleanMacro(PassFieldArrays, bool);
|
||
|
vtkGetMacro(PassFieldArrays, bool);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Get the MTime of this object also considering the locator and kernel.
|
||
|
*/
|
||
|
vtkMTimeType GetMTime() override;
|
||
|
|
||
|
protected:
|
||
|
vtkPointInterpolator();
|
||
|
~vtkPointInterpolator() override;
|
||
|
|
||
|
vtkAbstractPointLocator* Locator;
|
||
|
vtkInterpolationKernel* Kernel;
|
||
|
|
||
|
int NullPointsStrategy;
|
||
|
double NullValue;
|
||
|
vtkStdString ValidPointsMaskArrayName;
|
||
|
vtkCharArray* ValidPointsMask;
|
||
|
|
||
|
std::vector<vtkStdString> ExcludedArrays;
|
||
|
|
||
|
bool PromoteOutputArrays;
|
||
|
|
||
|
bool PassCellArrays;
|
||
|
bool PassPointArrays;
|
||
|
bool PassFieldArrays;
|
||
|
|
||
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
/**
|
||
|
* Virtual for specialized subclass(es)
|
||
|
*/
|
||
|
virtual void Probe(vtkDataSet* input, vtkDataSet* source, vtkDataSet* output);
|
||
|
|
||
|
/**
|
||
|
* Call at end of RequestData() to pass attribute data respecting the
|
||
|
* PassCellArrays, PassPointArrays, PassFieldArrays flags.
|
||
|
*/
|
||
|
virtual void PassAttributeData(vtkDataSet* input, vtkDataObject* source, vtkDataSet* output);
|
||
|
|
||
|
/**
|
||
|
* Internal method to extract image metadata
|
||
|
*/
|
||
|
void ExtractImageDescription(
|
||
|
vtkImageData* input, int dims[3], double origin[3], double spacing[3]);
|
||
|
|
||
|
private:
|
||
|
vtkPointInterpolator(const vtkPointInterpolator&) = delete;
|
||
|
void operator=(const vtkPointInterpolator&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|