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++
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
|