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.

201 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkParametricSpline.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 vtkParametricSpline
* @brief parametric function for 1D interpolating splines
*
* vtkParametricSpline is a parametric function for 1D interpolating splines.
* vtkParametricSpline maps the single parameter u into a 3D point (x,y,z)
* using three instances of interpolating splines. This family of 1D splines
* is guaranteed to be parameterized in the interval [0,1]. Attempting to
* evaluate outside this interval will cause the parameter u to be clamped in
* the range [0,1].
*
* When constructed, this class creates instances of vtkCardinalSpline for
* each of the x-y-z coordinates. The user may choose to replace these with
* their own instances of subclasses of vtkSpline.
*
* @warning
* If you wish to tessellate the spline, use the class
* vtkParametricFunctionSource.
*
* @sa
* vtkSpline vtkKochanekSpline vtkCardinalSpline
*/
#ifndef vtkParametricSpline_h
#define vtkParametricSpline_h
class vtkSpline;
class vtkPoints;
#include "vtkCommonComputationalGeometryModule.h" // For export macro
#include "vtkParametricFunction.h"
class VTKCOMMONCOMPUTATIONALGEOMETRY_EXPORT vtkParametricSpline : public vtkParametricFunction
{
public:
vtkTypeMacro(vtkParametricSpline, vtkParametricFunction);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Construct the spline with the following parameters:
* MinimumU = 0, MaximumU = 1, JoinU = 0 (unless the spline is
* closed, then JoinU = 1), TwistU = 0, DerivativesSupplied = 0
* (the other vtkParametricFunction parameters are ignored).
*/
static vtkParametricSpline* New();
/**
* Return the parametric dimension of the class.
*/
int GetDimension() override { return 1; }
/**
* Evaluate the spline at parametric coordinate u[0] returning
* the point coordinate Pt[3].
*/
void Evaluate(double u[3], double Pt[3], double Du[9]) override;
/**
* Evaluate a scalar value at parametric coordinate u[0] and Pt[3].
* The scalar value is just the parameter u[0].
*/
double EvaluateScalar(double u[3], double Pt[3], double Du[9]) override;
//@{
/**
* By default, this class is constructed with three instances of
* vtkCardinalSpline (for each of the x-y-z coordinate axes). The user may
* choose to create and assign their own instances of vtkSpline.
*/
void SetXSpline(vtkSpline*);
void SetYSpline(vtkSpline*);
void SetZSpline(vtkSpline*);
vtkGetObjectMacro(XSpline, vtkSpline);
vtkGetObjectMacro(YSpline, vtkSpline);
vtkGetObjectMacro(ZSpline, vtkSpline);
//@}
//@{
/**
* Specify the list of points defining the spline. Do this by
* specifying a vtkPoints array containing the points. Note that
* the order of the points in vtkPoints is the order that the
* splines will be fit.
*/
void SetPoints(vtkPoints*);
vtkGetObjectMacro(Points, vtkPoints);
//@}
//@{
/**
* Another API to set the points. Set the number of points and then set the
* individual point coordinates.
*/
void SetNumberOfPoints(vtkIdType numPts);
void SetPoint(vtkIdType index, double x, double y, double z);
//@}
//@{
/**
* Control whether the spline is open or closed. A closed spline forms
* a continuous loop: the first and last points are the same, and
* derivatives are continuous.
*/
vtkSetMacro(Closed, vtkTypeBool);
vtkGetMacro(Closed, vtkTypeBool);
vtkBooleanMacro(Closed, vtkTypeBool);
//@}
//@{
/**
* Control whether the spline is parameterized by length or by point index.
* Default is by length.
*/
vtkSetMacro(ParameterizeByLength, vtkTypeBool);
vtkGetMacro(ParameterizeByLength, vtkTypeBool);
vtkBooleanMacro(ParameterizeByLength, vtkTypeBool);
//@}
//@{
/**
* Set the type of constraint of the left(right) end points. Four
* constraints are available:
* 0: the first derivative at left(right) most point is determined
* from the line defined from the first(last) two points.
* 1: the first derivative at left(right) most point is set to
* Left(Right)Value.
* 2: the second derivative at left(right) most point is set to
* Left(Right)Value.
* 3: the second derivative at left(right)most points is Left(Right)Value
* times second derivative at first interior point.
*/
vtkSetClampMacro(LeftConstraint, int, 0, 3);
vtkGetMacro(LeftConstraint, int);
vtkSetClampMacro(RightConstraint, int, 0, 3);
vtkGetMacro(RightConstraint, int);
//@}
//@{
/**
* The values of the derivative on the left and right sides. The value
* is used only if the left(right) constraint is type 1-3.
*/
vtkSetMacro(LeftValue, double);
vtkGetMacro(LeftValue, double);
vtkSetMacro(RightValue, double);
vtkGetMacro(RightValue, double);
//@}
protected:
vtkParametricSpline();
~vtkParametricSpline() override;
// Points definition
vtkPoints* Points;
// The interpolating splines for each of the x-y-z coordinates
vtkSpline* XSpline;
vtkSpline* YSpline;
vtkSpline* ZSpline;
// Supplemental variables
vtkTypeBool Closed;
int LeftConstraint;
int RightConstraint;
double LeftValue;
double RightValue;
vtkTypeBool ParameterizeByLength;
// Initializing the spline
vtkMTimeType InitializeTime;
int Initialize();
// Internal variable for managing parametric coordinates
double Length;
double ClosedLength;
private:
vtkParametricSpline(const vtkParametricSpline&) = delete;
void operator=(const vtkParametricSpline&) = delete;
};
#endif