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.

137 lines
4.3 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSplineRepresentation.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 vtkSplineRepresentation
* @brief representation for a spline.
*
* vtkSplineRepresentation is a vtkWidgetRepresentation for a spline.
* This 3D widget defines a spline that can be interactively placed in a
* scene. The spline has handles, the number of which can be changed, plus it
* can be picked on the spline itself to translate or rotate it in the scene.
* This is based on vtkSplineWidget.
* @sa
* vtkSplineWidget, vtkSplineWidget2
*/
#ifndef vtkSplineRepresentation_h
#define vtkSplineRepresentation_h
#include "vtkCurveRepresentation.h"
#include "vtkInteractionWidgetsModule.h" // For export macro
class vtkActor;
class vtkCellPicker;
class vtkDoubleArray;
class vtkParametricFunctionSource;
class vtkParametricSpline;
class vtkPlaneSource;
class vtkPoints;
class vtkPolyData;
class vtkProp;
class vtkProperty;
class vtkSphereSource;
class vtkTransform;
class VTKINTERACTIONWIDGETS_EXPORT vtkSplineRepresentation : public vtkCurveRepresentation
{
public:
static vtkSplineRepresentation* New();
vtkTypeMacro(vtkSplineRepresentation, vtkCurveRepresentation);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Grab the polydata (including points) that defines the spline. The
* polydata consists of points and line segments numbering Resolution + 1
* and Resolution, respectively. Points are guaranteed to be up-to-date when
* either the InteractionEvent or EndInteraction events are invoked. The
* user provides the vtkPolyData and the points and polyline are added to it.
*/
void GetPolyData(vtkPolyData* pd) override;
/**
* Set the number of handles for this widget.
*/
void SetNumberOfHandles(int npts) override;
//@{
/**
* Set/Get the number of line segments representing the spline for
* this widget.
*/
void SetResolution(int resolution);
vtkGetMacro(Resolution, int);
//@}
//@{
/**
* Set the parametric spline object. Through vtkParametricSpline's API, the
* user can supply and configure one of two types of spline:
* vtkCardinalSpline, vtkKochanekSpline. The widget controls the open
* or closed configuration of the spline.
* WARNING: The widget does not enforce internal consistency so that all
* three are of the same type.
*/
virtual void SetParametricSpline(vtkParametricSpline*);
vtkGetObjectMacro(ParametricSpline, vtkParametricSpline);
//@}
/**
* Get the position of the spline handles.
*/
vtkDoubleArray* GetHandlePositions() override;
/**
* Get the approximate vs. the true arc length of the spline. Calculated as
* the summed lengths of the individual straight line segments. Use
* SetResolution to control the accuracy.
*/
double GetSummedLength() override;
/**
* Convenience method to allocate and set the handles from a vtkPoints
* instance. If the first and last points are the same, the spline sets
* Closed to the on InteractionState and disregards the last point, otherwise Closed
* remains unchanged.
*/
void InitializeHandles(vtkPoints* points) override;
/**
* These are methods that satisfy vtkWidgetRepresentation's API. Note that a
* version of place widget is available where the center and handle position
* are specified.
*/
void BuildRepresentation() override;
protected:
vtkSplineRepresentation();
~vtkSplineRepresentation() override;
// The spline
vtkParametricSpline* ParametricSpline;
vtkParametricFunctionSource* ParametricFunctionSource;
// The number of line segments used to represent the spline.
int Resolution;
// Specialized method to insert a handle on the poly line.
int InsertHandleOnLine(double* pos) override;
private:
vtkSplineRepresentation(const vtkSplineRepresentation&) = delete;
void operator=(const vtkSplineRepresentation&) = delete;
};
#endif