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