Skip to content

Commit d30f6b9

Browse files
Merge pull request #18 from LIHPC-Computational-Geometry/ellipsoid-dev
Classes vtkEllipsoid and vtkEllipsoidWidget.
2 parents 183f442 + 87da4ff commit d30f6b9

File tree

8 files changed

+649
-2
lines changed

8 files changed

+649
-2
lines changed

cmake/version.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44

55
set (VTK_CONTRIB_MAJOR_VERSION "5")
6-
set (VTK_CONTRIB_MINOR_VERSION "14")
6+
set (VTK_CONTRIB_MINOR_VERSION "15")
77
set (VTK_CONTRIB_RELEASE_VERSION "0")
88
set (VTK_CONTRIB_VERSION ${VTK_CONTRIB_MAJOR_VERSION}.${VTK_CONTRIB_MINOR_VERSION}.${VTK_CONTRIB_RELEASE_VERSION})
99

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#ifndef VTK_ELLIPSOID_H
2+
#define VTK_ELLIPSOID_H
3+
4+
#include <vtkImplicitFunction.h>
5+
6+
7+
/**
8+
* <P>Classe décrivant une ellipsoïde selon les axes Ox, Oy et Oz.</P>
9+
*
10+
* <P>Cette classe étant une <I>vtkImplicitFunction</I>, il convient d'en positionner et orienter les instances
11+
* dans le repère cartésien (0, i, j, k) par transformation inverse avant d'utiliser ses fonctions Evaluate*.
12+
* => Instancier une <I>vtkTransform</I> commençant par une translation vers 0 puis effectuant des rotations
13+
* selon Ox, Oy puis Oz que l'on lui affecte à l'instance via <I>SetTransform</I>.
14+
* </P>
15+
*/
16+
class vtkEllipsoid : public vtkImplicitFunction
17+
{
18+
public:
19+
20+
vtkTypeMacro(vtkEllipsoid, vtkImplicitFunction);
21+
22+
/**
23+
* Créé une ellipsoïde le long des axes Ox, Oy et Oz centrée en (0, 0, 0) de rayons 1.
24+
*/
25+
static vtkEllipsoid* New ( );
26+
27+
virtual void PrintSelf (ostream& os, vtkIndent indent);
28+
29+
/**
30+
* Evalue la fonction implicite de l'ellipsoïde.
31+
*/
32+
virtual double EvaluateFunction (double x[3]);
33+
34+
/**
35+
* Evalue le gradient de l'ellipsoïde.
36+
*/
37+
virtual void EvaluateGradient (double x[3], double g[3]);
38+
39+
/**
40+
* Définition des rayons de l'ellipsoïde.
41+
*/
42+
vtkSetMacro (XRadius, double);
43+
vtkGetMacro (XRadius, double);
44+
vtkSetMacro (YRadius, double);
45+
vtkGetMacro (YRadius, double);
46+
vtkSetMacro (ZRadius, double);
47+
vtkGetMacro (ZRadius, double);
48+
49+
50+
protected :
51+
52+
/**
53+
* Constructeur. Centre l'ellipsoïde en (0, 0, 0) et affecte 1. à ses rayons.
54+
*/
55+
vtkEllipsoid ( );
56+
57+
/**
58+
* Destructeur. RAS.
59+
*/
60+
virtual ~vtkEllipsoid ( );
61+
62+
/** Les rayonq de l'ellipsoïde. */
63+
double XRadius;
64+
double YRadius;
65+
double ZRadius;
66+
67+
68+
private :
69+
70+
/**
71+
* Constructeur de copie et opérateur = : interdits.
72+
*/
73+
vtkEllipsoid (const vtkEllipsoid&);
74+
vtkEllipsoid& operator = (const vtkEllipsoid&);
75+
}; // class vtkEllipsoid
76+
77+
78+
#endif // VTK_ELLIPSOID_H
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/**
2+
* Widget de saisie d'une ellipsoïde dans l'espace.
3+
* @author Charles PIGNEROL, CEA/DAM/DCLC
4+
* @date 09/12/2025
5+
*/
6+
7+
#ifndef VTK_ELLIPSOID_WIDGET_H
8+
#define VTK_ELLIPSOID_WIDGET_H
9+
10+
#include "VtkContrib/vtkEllipsoid.h"
11+
#include "VtkContrib/vtkPolygonFilter.h"
12+
13+
#include <vtkBoxWidget.h>
14+
#include <vtkCommand.h>
15+
#include <vtkPolyDataMapper.h>
16+
#include <vtkParametricEllipsoid.h>
17+
#include <vtkParametricFunctionSource.h>
18+
#include <vtkTransform.h>
19+
20+
21+
/**
22+
* <P>Un widget pour saisir interactivement une ellipsoïde. L'ellipsoïde est ici délimitée par 6 plans qui en définissent la bordure.
23+
* Les plans sont numérotés de 0 à 6 comme suit : gauche, droit, haut, bas, derrière, devant. L'ellipsoïde est tangente en ces 6 plans.</P>
24+
*
25+
* <P>Pour mémo, la transformation portée par la classe vtkBoxWidget décrit la transformation effectuée à partir de PlaceWidget,
26+
* ce qui implique que la position initiale n'est pas décrite dans cette transformation.
27+
* Concernant l'ellipsoid, décrite de manière paramétrique (classe vtkParametricEllipsoid), elle est centrée en 0. Cette ellipsoid est
28+
* représentée par un acteur véhiculant une transformation analogue à celle de vtkBoxWidget mais portant en plus la position initiale.
29+
* </P>
30+
*
31+
* <P>tests/ellipsoid_widget.cpp est un exemple d'utilisation avec callback permettant de connaître l'ellipsoïde définie.</P>
32+
* @see vtkEllipsoid
33+
*/
34+
class vtkEllipsoidWidget : public vtkBoxWidget
35+
{
36+
public :
37+
38+
vtkTypeMacro(vtkEllipsoidWidget,vtkBoxWidget)
39+
40+
/**
41+
* Créé une représentation de type vtkConstrainedPointHandleRepresentation2.
42+
*/
43+
virtual void CreateDefaultRepresentation ( );
44+
45+
/**
46+
* Instanciation de la classe.
47+
*/
48+
static vtkEllipsoidWidget* New ( );
49+
50+
//@{
51+
/**
52+
* Methods that satisfy the superclass' API.
53+
*/
54+
virtual void PlaceWidget (double bounds [6]);
55+
virtual void PlaceWidget (double xRadius, double yRadius, double zRadius, vtkTransform* transform);
56+
virtual void SetEnabled (int);
57+
//@}
58+
59+
//@{
60+
/**
61+
* Modifications des propriété du widget.
62+
*/
63+
64+
/**
65+
* Les dimensions de l'ellipsoïde selon les 3 axes (avant transformation).
66+
*/
67+
virtual void GetPosition (double& x, double& y, double& z);
68+
69+
/**
70+
* Les dimensions de l'ellipsoïde selon les 3 axes.
71+
*/
72+
virtual double GetXRadius ( );
73+
virtual double GetYRadius ( );
74+
virtual double GetZRadius ( );
75+
76+
/**
77+
* La discrétisation de l'ellipsoïde autour des 3 axes (avant transformation).
78+
*/
79+
virtual void GetDiscretisation (unsigned int& u, unsigned int& v, unsigned int& w);
80+
virtual void SetDiscretisation (unsigned int u, unsigned int v, unsigned int w);
81+
82+
/**
83+
* @param Opacité de l'ellipsoïde affichée.
84+
*/
85+
virtual void SetEllipsoidOpacity (double opacity);
86+
87+
/**
88+
* @param Composantes RGB des l'ellipsoïde.
89+
*/
90+
virtual void SetEllipsoidColor (double rgb [3]);
91+
virtual void SetEllipsoidColor (double r, double g, double b);
92+
//@}
93+
94+
95+
protected :
96+
97+
/**
98+
* Appelé lorsque la box widget est modifiée : actualise l'ellipsoïde.
99+
*/
100+
class vtkBoxInteractionCommand : public vtkCommand
101+
{
102+
public :
103+
104+
vtkBoxInteractionCommand ( )
105+
: _widget (0)
106+
{ }
107+
virtual ~vtkBoxInteractionCommand ( )
108+
{ _widget = 0; }
109+
static vtkBoxInteractionCommand* New ( );
110+
111+
virtual void SetWidget (vtkEllipsoidWidget* widget)
112+
{ _widget = widget; }
113+
virtual void Execute (vtkObject* caller, unsigned long id, void* calldata);
114+
115+
116+
private :
117+
118+
vtkBoxInteractionCommand (const vtkBoxInteractionCommand&)
119+
: _widget (0)
120+
{ }
121+
vtkBoxInteractionCommand& operator = (const vtkBoxInteractionCommand&)
122+
{ return *this; }
123+
124+
vtkEllipsoidWidget* _widget;
125+
}; // class vtkBoxInteractionCommand
126+
127+
/**
128+
* Actualise la représentation de l'ellipsoïde suite à une modification de l'interacteur.
129+
*/
130+
virtual void UpdateEllipsoid ( );
131+
132+
133+
private :
134+
135+
/**
136+
* Constructeur.
137+
*/
138+
vtkEllipsoidWidget ( );
139+
140+
/**
141+
* Destructeur. RAS.
142+
*/
143+
virtual ~vtkEllipsoidWidget ( );
144+
145+
/**
146+
* Constructeur et opérateur = : interdits.
147+
*/
148+
vtkEllipsoidWidget (const vtkEllipsoidWidget&);
149+
vtkEllipsoidWidget& operator = (const vtkEllipsoidWidget&);
150+
151+
/** L'ellipsoïde et sa représentation. */
152+
vtkSmartPointer<vtkParametricEllipsoid> _ellipsoid;
153+
vtkSmartPointer<vtkParametricFunctionSource> _ellipsoidSource;
154+
vtkSmartPointer<vtkPolygonFilter> _polygonFilter;
155+
vtkSmartPointer<vtkPolyDataMapper> _ellipsoidMapper;
156+
vtkSmartPointer<vtkActor> _ellipsoidActor;
157+
vtkSmartPointer<vtkBoxInteractionCommand> _interactionCallback;
158+
vtkSmartPointer<vtkTransform> _transform;
159+
}; // class vtkEllipsoidWidget
160+
161+
162+
#endif // VTK_ELLIPSOID_WIDGET_H

src/VtkContrib/vtkEllipsoid.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include <VtkContrib/vtkEllipsoid.h>
2+
#include <vtkObjectFactory.h>
3+
4+
5+
vtkStandardNewMacro (vtkEllipsoid);
6+
7+
8+
vtkEllipsoid::vtkEllipsoid (const vtkEllipsoid&)
9+
: vtkImplicitFunction ( ), XRadius (1.), YRadius (1.), ZRadius (1.)
10+
{
11+
} // vtkEllipsoid::vtkEllipsoid
12+
13+
14+
vtkEllipsoid& vtkEllipsoid::operator = (const vtkEllipsoid&)
15+
{
16+
return *this;
17+
} // vtkEllipsoid::operator =
18+
19+
20+
vtkEllipsoid::vtkEllipsoid ( )
21+
{
22+
this->XRadius = 1.0;
23+
this->YRadius = 1.0;
24+
this->ZRadius = 1.0;
25+
} // vtkEllipsoid::vtkEllipsoid
26+
27+
28+
vtkEllipsoid::~vtkEllipsoid ( )
29+
{
30+
} // vtkEllipsoid::~vtkEllipsoid
31+
32+
33+
double vtkEllipsoid::EvaluateFunction (double x [3])
34+
{
35+
double x2 = x [0] * x [0];
36+
double y2 = x [1] * x [1];
37+
double z2 = x [2] * x [2];
38+
return (x2 / (this->XRadius * this->XRadius) + y2 / (this->YRadius * this->YRadius) + z2 / (this->ZRadius * this->ZRadius)) - 1.0;
39+
} // vtkEllipsoid::EvaluateFunction
40+
41+
42+
void vtkEllipsoid::EvaluateGradient (double x [3], double g [3])
43+
{
44+
g [0] = 2.0 * x [0] / (this->XRadius * this->XRadius);
45+
g [1] = 2.0 * x [1] / (this->YRadius * this->YRadius);
46+
g [2] = 2.0 * x [2] / (this->ZRadius * this->ZRadius);
47+
} // vtkEllipsoid::EvaluateGradient
48+
49+
50+
void vtkEllipsoid::PrintSelf (ostream& os, vtkIndent indent)
51+
{
52+
this->Superclass::PrintSelf(os,indent);
53+
54+
os << "XRadius: " << this->XRadius << ", YRadius:" << this->YRadius << ", ZRadius:" << this->ZRadius << "\n";
55+
} // vtkEllipsoid::PrintSelf

0 commit comments

Comments
 (0)