File: vtkSuperquadric.h

package info (click to toggle)
paraview 5.11.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 497,236 kB
  • sloc: cpp: 3,171,290; ansic: 1,315,072; python: 134,290; xml: 103,324; sql: 65,887; sh: 5,286; javascript: 4,901; yacc: 4,383; java: 3,977; perl: 2,363; lex: 1,909; f90: 1,255; objc: 143; makefile: 119; tcl: 59; pascal: 50; fortran: 29
file content (146 lines) | stat: -rw-r--r-- 4,424 bytes parent folder | download
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
144
145
146
/*=========================================================================

  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

VTK_ABI_NAMESPACE_BEGIN
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 = default;

  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;
};

VTK_ABI_NAMESPACE_END
#endif