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.

180 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkTupleInterpolator.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 vtkTupleInterpolator
* @brief interpolate a tuple of arbitrary size
*
* This class is used to interpolate a tuple which may have an arbitrary
* number of components (but at least one component). The interpolation may
* be linear in form, or via a subclasses of vtkSpline.
*
* To use this class, begin by specifying the number of components of the
* tuple and the interpolation function to use. Then specify at least one
* pair of (t,tuple) with the AddTuple() method. Next interpolate the
* tuples with the InterpolateTuple(t,tuple) method, where "t" must be in the
* range of (t_min,t_max) parameter values specified by the AddTuple() method
* (if not then t is clamped), and tuple[] is filled in by the method (make
* sure that tuple [] is long enough to hold the interpolated data).
*
* You can control the type of interpolation to use. By default, the
* interpolation is based on a Kochanek spline. However, other types of
* splines can be specified. You can also set the interpolation method
* to linear, in which case the specified spline has no effect on the
* interpolation.
*
* @warning
* Setting the number of components or changing the type of interpolation
* causes the list of tuples to be reset, so any data inserted up to that
* point is lost. Bisection methods are used to speed up the search for the
* interpolation interval.
*/
#ifndef vtkTupleInterpolator_h
#define vtkTupleInterpolator_h
#include "vtkObject.h"
#include "vtkRenderingCoreModule.h" // For export macro
class vtkSpline;
class vtkPiecewiseFunction;
class VTKRENDERINGCORE_EXPORT vtkTupleInterpolator : public vtkObject
{
public:
vtkTypeMacro(vtkTupleInterpolator, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Instantiate the class.
*/
static vtkTupleInterpolator* New();
//@{
/**
* Specify the number of tuple components to interpolate. Note that setting
* this value discards any previously inserted data.
*/
void SetNumberOfComponents(int numComp);
vtkGetMacro(NumberOfComponents, int);
//@}
/**
* Return the number of tuples in the list of tuples to be
* interpolated.
*/
int GetNumberOfTuples();
//@{
/**
* Obtain some information about the interpolation range. The numbers
* returned (corresponding to parameter t, usually thought of as time)
* are undefined if the list of transforms is empty. This is a convenience
* method for interpolation.
*/
double GetMinimumT();
double GetMaximumT();
//@}
/**
* Reset the class so that it contains no (t,tuple) information.
*/
void Initialize();
/**
* Add another tuple to the list of tuples to be interpolated. Note that
* using the same time t value more than once replaces the previous tuple
* value at t. At least two tuples must be added to define an
* interpolation function.
*/
void AddTuple(double t, double tuple[]);
/**
* Delete the tuple at a particular parameter t. If there is no
* tuple defined at t, then the method does nothing.
*/
void RemoveTuple(double t);
/**
* Interpolate the list of tuples and determine a new tuple (i.e.,
* fill in the tuple provided). If t is outside the range of
* (min,max) values, then t is clamped. Note that each component
* of tuple[] is interpolated independently.
*/
void InterpolateTuple(double t, double tuple[]);
/**
* Enums to control the type of interpolation to use.
*/
enum
{
INTERPOLATION_TYPE_LINEAR = 0,
INTERPOLATION_TYPE_SPLINE
};
//@{
/**
* Specify which type of function to use for interpolation. By default
* spline interpolation (SetInterpolationFunctionToSpline()) is used
* (i.e., a Kochanek spline) and the InterpolatingSpline instance variable
* is used to birth the actual interpolation splines via a combination of
* NewInstance() and DeepCopy(). You may also choose to use linear
* interpolation by invoking SetInterpolationFunctionToLinear(). Note that
* changing the type of interpolation causes previously inserted data
* to be discarded.
*/
void SetInterpolationType(int type);
vtkGetMacro(InterpolationType, int);
void SetInterpolationTypeToLinear() { this->SetInterpolationType(INTERPOLATION_TYPE_LINEAR); }
void SetInterpolationTypeToSpline() { this->SetInterpolationType(INTERPOLATION_TYPE_SPLINE); }
//@}
//@{
/**
* If the InterpolationType is set to spline, then this method applies. By
* default Kochanek interpolation is used, but you can specify any instance
* of vtkSpline to use. Note that the actual interpolating splines are
* created by invoking NewInstance() followed by DeepCopy() on the
* interpolating spline specified here, for each tuple component to
* interpolate.
*/
void SetInterpolatingSpline(vtkSpline*);
vtkGetObjectMacro(InterpolatingSpline, vtkSpline);
//@}
protected:
vtkTupleInterpolator();
~vtkTupleInterpolator() override;
// The number of components being interpolated
int NumberOfComponents;
// Specify the type of interpolation to use
int InterpolationType;
// This is the default 1D spline to use
vtkSpline* InterpolatingSpline;
// Internal variables for interpolation functions
void InitializeInterpolation();
vtkPiecewiseFunction** Linear;
vtkSpline** Spline;
private:
vtkTupleInterpolator(const vtkTupleInterpolator&) = delete;
void operator=(const vtkTupleInterpolator&) = delete;
};
#endif