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.

167 lines
4.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSphereSource.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 vtkSphereSource
* @brief create a polygonal sphere centered at the origin
*
* vtkSphereSource creates a sphere (represented by polygons) of specified
* radius centered at the origin. The resolution (polygonal discretization)
* in both the latitude (phi) and longitude (theta) directions can be
* specified. It also is possible to create partial spheres by specifying
* maximum phi and theta angles. By default, the surface tessellation of
* the sphere uses triangles; however you can set LatLongTessellation to
* produce a tessellation using quadrilaterals.
* @warning
* Resolution means the number of latitude or longitude lines for a complete
* sphere. If you create partial spheres the number of latitude/longitude
* lines may be off by one.
*/
#ifndef vtkSphereSource_h
#define vtkSphereSource_h
#include "vtkFiltersSourcesModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
#define VTK_MAX_SPHERE_RESOLUTION 1024
class VTKFILTERSSOURCES_EXPORT vtkSphereSource : public vtkPolyDataAlgorithm
{
public:
vtkTypeMacro(vtkSphereSource, vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Construct sphere with radius=0.5 and default resolution 8 in both Phi
* and Theta directions. Theta ranges from (0,360) and phi (0,180) degrees.
*/
static vtkSphereSource* New();
//@{
/**
* Set radius of sphere. Default is .5.
*/
vtkSetClampMacro(Radius, double, 0.0, VTK_DOUBLE_MAX);
vtkGetMacro(Radius, double);
//@}
//@{
/**
* Set the center of the sphere. Default is 0,0,0.
*/
vtkSetVector3Macro(Center, double);
vtkGetVectorMacro(Center, double, 3);
//@}
//@{
/**
* Set the number of points in the longitude direction (ranging from
* StartTheta to EndTheta).
*/
vtkSetClampMacro(ThetaResolution, int, 3, VTK_MAX_SPHERE_RESOLUTION);
vtkGetMacro(ThetaResolution, int);
//@}
//@{
/**
* Set the number of points in the latitude direction (ranging
* from StartPhi to EndPhi).
*/
vtkSetClampMacro(PhiResolution, int, 3, VTK_MAX_SPHERE_RESOLUTION);
vtkGetMacro(PhiResolution, int);
//@}
//@{
/**
* Set the starting longitude angle. By default StartTheta=0 degrees.
*/
vtkSetClampMacro(StartTheta, double, 0.0, 360.0);
vtkGetMacro(StartTheta, double);
//@}
//@{
/**
* Set the ending longitude angle. By default EndTheta=360 degrees.
*/
vtkSetClampMacro(EndTheta, double, 0.0, 360.0);
vtkGetMacro(EndTheta, double);
//@}
//@{
/**
* Set the starting latitude angle (0 is at north pole). By default
* StartPhi=0 degrees.
*/
vtkSetClampMacro(StartPhi, double, 0.0, 360.0);
vtkGetMacro(StartPhi, double);
//@}
//@{
/**
* Set the ending latitude angle. By default EndPhi=180 degrees.
*/
vtkSetClampMacro(EndPhi, double, 0.0, 360.0);
vtkGetMacro(EndPhi, double);
//@}
//@{
/**
* Cause the sphere to be tessellated with edges along the latitude
* and longitude lines. If off, triangles are generated at non-polar
* regions, which results in edges that are not parallel to latitude and
* longitude lines. If on, quadrilaterals are generated everywhere
* except at the poles. This can be useful for generating a wireframe
* sphere with natural latitude and longitude lines.
*/
vtkSetMacro(LatLongTessellation, vtkTypeBool);
vtkGetMacro(LatLongTessellation, vtkTypeBool);
vtkBooleanMacro(LatLongTessellation, vtkTypeBool);
//@}
//@{
/**
* 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:
vtkSphereSource(int res = 8);
~vtkSphereSource() override {}
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
double Radius;
double Center[3];
int ThetaResolution;
int PhiResolution;
double StartTheta;
double EndTheta;
double StartPhi;
double EndPhi;
vtkTypeBool LatLongTessellation;
int OutputPointsPrecision;
private:
vtkSphereSource(const vtkSphereSource&) = delete;
void operator=(const vtkSphereSource&) = delete;
};
#endif