/*========================================================================= Program: Visualization Toolkit Module: vtkSuperquadricSource.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 vtkSuperquadricSource * @brief create a polygonal superquadric centered * at the origin * * vtkSuperquadricSource creates a superquadric (represented by polygons) of * specified size centered at the origin. The alignment of the axis of the * superquadric along one of the global axes can be specified. The resolution * (polygonal discretization) * in both the latitude (phi) and longitude (theta) directions can be * specified. Roundness parameters (PhiRoundness and ThetaRoundness) control * the shape of the superquadric. The Toroidal boolean controls whether * a toroidal superquadric is produced. If so, the Thickness parameter * controls the thickness of the toroid: 0 is the thinnest allowable * toroid, and 1 has a minimum sized hole. The Scale parameters allow * the superquadric to be scaled in x, y, and z (normal vectors are correctly * generated in any case). The Size parameter controls size of the * superquadric. * * This code is based on "Rigid physically based superquadrics", A. H. Barr, * in "Graphics Gems III", David Kirk, ed., Academic Press, 1992. * * @warning * Resolution means the number of latitude or longitude lines for a complete * superquadric. The resolution parameters are rounded to the nearest 4 * in phi and 8 in theta. * * @warning * Texture coordinates are not equally distributed around all superquadrics. * * @warning * The Size and Thickness parameters control coefficients of superquadric * generation, and may do not exactly describe the size of the superquadric. * */ #ifndef vtkSuperquadricSource_h #define vtkSuperquadricSource_h #include "vtkFiltersSourcesModule.h" // For export macro #include "vtkPolyDataAlgorithm.h" #define VTK_MAX_SUPERQUADRIC_RESOLUTION 1024 #define VTK_MIN_SUPERQUADRIC_THICKNESS 1e-4 #define VTK_MIN_SUPERQUADRIC_ROUNDNESS 1e-24 class VTKFILTERSSOURCES_EXPORT vtkSuperquadricSource : public vtkPolyDataAlgorithm { public: /** * Create a default superquadric with a radius of 0.5, non-toroidal, * spherical, and centered at the origin, with a scaling factor of 1 in each * direction, a theta resolution and a phi resolutions of 16. */ static vtkSuperquadricSource *New(); vtkTypeMacro(vtkSuperquadricSource,vtkPolyDataAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE; //@{ /** * Set the center of the superquadric. Default is 0,0,0. */ vtkSetVector3Macro(Center,double); vtkGetVectorMacro(Center,double,3); //@} //@{ /** * Set the scale factors of the superquadric. Default is 1,1,1. */ vtkSetVector3Macro(Scale,double); vtkGetVectorMacro(Scale,double,3); //@} //@{ /** * Set the number of points in the longitude direction. Initial value is 16. */ vtkGetMacro(ThetaResolution,int); void SetThetaResolution(int i); //@} //@{ /** * Set the number of points in the latitude direction. Initial value is 16. */ vtkGetMacro(PhiResolution,int); void SetPhiResolution(int i); //@} //@{ /** * Set/Get Superquadric ring thickness (toroids only). * Changing thickness maintains the outside diameter of the toroid. * Initial value is 0.3333. */ vtkGetMacro(Thickness,double); vtkSetClampMacro(Thickness,double,VTK_MIN_SUPERQUADRIC_THICKNESS,1.0); //@} //@{ /** * Set/Get Superquadric north/south roundness. * Values range from 0 (rectangular) to 1 (circular) to higher orders. * Initial value is 1.0. */ vtkGetMacro(PhiRoundness,double); void SetPhiRoundness(double e); //@} //@{ /** * Set/Get Superquadric east/west roundness. * Values range from 0 (rectangular) to 1 (circular) to higher orders. * Initial value is 1.0. */ vtkGetMacro(ThetaRoundness,double); void SetThetaRoundness(double e); //@} //@{ /** * Set/Get Superquadric isotropic size. Initial value is 0.5; */ vtkSetMacro(Size,double); vtkGetMacro(Size,double); //@} //@{ /** * Set/Get axis of symmetry for superquadric (x axis: 0, y axis: 1, z axis: 2). Initial value is 1. */ vtkSetMacro(AxisOfSymmetry,int); vtkGetMacro(AxisOfSymmetry,int); void SetXAxisOfSymmetry() { this->SetAxisOfSymmetry(0); } void SetYAxisOfSymmetry() { this->SetAxisOfSymmetry(1); } void SetZAxisOfSymmetry() { this->SetAxisOfSymmetry(2); } //@} //@{ /** * Set/Get whether or not the superquadric is toroidal (1) or ellipsoidal (0). * Initial value is 0. */ vtkBooleanMacro(Toroidal,int); vtkGetMacro(Toroidal,int); vtkSetMacro(Toroidal,int); //@} //@{ /** * Set/get the desired precision for the output points. * vtkAlgorithm::SINGLE_PRECISION - Output single-precision floating point. * vtkAlgorithm::DOUBLE_PRECISION - Output double-precision floating point. */ vtkSetMacro(OutputPointsPrecision,int); vtkGetMacro(OutputPointsPrecision,int); //@} protected: vtkSuperquadricSource(int res=16); ~vtkSuperquadricSource() VTK_OVERRIDE {} int Toroidal; int AxisOfSymmetry; double Thickness; double Size; double PhiRoundness; double ThetaRoundness; int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) VTK_OVERRIDE; double Center[3]; double Scale[3]; int ThetaResolution; int PhiResolution; int OutputPointsPrecision; private: vtkSuperquadricSource(const vtkSuperquadricSource&) VTK_DELETE_FUNCTION; void operator=(const vtkSuperquadricSource&) VTK_DELETE_FUNCTION; }; #endif