forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkSuperquadric.h
145 lines (123 loc) · 4.24 KB
/
vtkSuperquadric.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*=========================================================================
Program: Visualization Toolkit
Module: vtkSuperquadric.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 vtkSuperquadric
* @brief implicit function for a Superquadric
*
* vtkSuperquadric computes the implicit function and function gradient
* for a superquadric. vtkSuperquadric is a concrete implementation of
* vtkImplicitFunction. The superquadric is centered at Center and axes
* of rotation is along the y-axis. (Use the superclass'
* vtkImplicitFunction transformation matrix if necessary to reposition.)
* 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
* The Size and Thickness parameters control coefficients of superquadric
* generation, and may do not exactly describe the size of the superquadric.
*
*/
#ifndef vtkSuperquadric_h
#define vtkSuperquadric_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkImplicitFunction.h"
#define VTK_MIN_SUPERQUADRIC_THICKNESS 1e-4
class VTKCOMMONDATAMODEL_EXPORT vtkSuperquadric : public vtkImplicitFunction
{
public:
/**
* Construct with superquadric radius of 0.5, toroidal off, center at 0.0,
* scale (1,1,1), size 0.5, phi roundness 1.0, and theta roundness 0.0.
*/
static vtkSuperquadric *New();
vtkTypeMacro(vtkSuperquadric,vtkImplicitFunction);
void PrintSelf(ostream& os, vtkIndent indent) override;
// ImplicitFunction interface
using vtkImplicitFunction::EvaluateFunction;
double EvaluateFunction(double x[3]) override;
void EvaluateGradient(double x[3], double g[3]) 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/Get Superquadric ring thickness (toroids only).
* Changing thickness maintains the outside diameter of the toroid.
*/
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.
*/
vtkGetMacro(PhiRoundness,double);
void SetPhiRoundness(double e);
//@}
//@{
/**
* Set/Get Superquadric east/west roundness.
* Values range from 0 (rectangular) to 1 (circular) to higher orders.
*/
vtkGetMacro(ThetaRoundness,double);
void SetThetaRoundness(double e);
//@}
//@{
/**
* Set/Get Superquadric isotropic size.
*/
vtkSetMacro(Size,double);
vtkGetMacro(Size,double);
//@}
//@{
/**
* Set/Get whether or not the superquadric is toroidal (1) or ellipsoidal (0).
*/
vtkBooleanMacro(Toroidal,vtkTypeBool);
vtkGetMacro(Toroidal,vtkTypeBool);
vtkSetMacro(Toroidal,vtkTypeBool);
//@}
protected:
vtkSuperquadric();
~vtkSuperquadric() override {}
vtkTypeBool Toroidal;
double Thickness;
double Size;
double PhiRoundness;
double ThetaRoundness;
double Center[3];
double Scale[3];
private:
vtkSuperquadric(const vtkSuperquadric&) = delete;
void operator=(const vtkSuperquadric&) = delete;
};
#endif