BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Rotations.h
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Sample/Scattering/Rotations.h
6 //! @brief Defines IRotation classes.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************** //
14 
15 #ifndef BORNAGAIN_CORE_SCATTERING_ROTATIONS_H
16 #define BORNAGAIN_CORE_SCATTERING_ROTATIONS_H
17 
18 #include "Base/Types/ICloneable.h"
19 #include "Param/Node/INode.h"
20 
21 class Transform3D;
22 
23 //! Pure virtual interface for rotations.
24 //! @ingroup samples
25 
26 class IRotation : public ICloneable, public INode
27 {
28 public:
29  static IRotation* createRotation(const Transform3D& transform);
30  static IRotation* createIdentity();
31 
32  IRotation(const NodeMeta& meta, const std::vector<double>& PValues);
33 
34  virtual IRotation* clone() const = 0;
35 
36  //! Returns a new IRotation object that is the current object's inverse
37  virtual IRotation* createInverse() const = 0;
38 
39  //! Returns transformation.
40  virtual Transform3D getTransform3D() const = 0;
41 
42  kvector_t transformed(const kvector_t& v) const;
43 
44  //! Returns true if rotation matrix is identity matrix (no rotations)
45  virtual bool isIdentity() const;
46 
47  bool zInvariant() const;
48 };
49 
50 IRotation* createProduct(const IRotation& left, const IRotation& right);
51 
52 //! The identity rotation, which leaves everything in place.
53 
54 class IdentityRotation : public IRotation // TODO get rid of this class
55 {
56 public:
58 
59  IdentityRotation* clone() const { return new IdentityRotation(); }
60  IdentityRotation* createInverse() const { return new IdentityRotation(); }
61 
62  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
63 
65 
66  bool isIdentity() const { return true; }
67 };
68 
69 //! A rotation about the x axis.
70 
71 class RotationX : public IRotation
72 {
73 public:
74  RotationX(const std::vector<double> P);
75  RotationX(double angle);
76 
77  RotationX* clone() const { return new RotationX(m_angle); }
78  RotationX* createInverse() const { return new RotationX(-m_angle); }
79 
80  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
81 
82  double getAngle() const { return m_angle; }
83 
85 
86 protected:
87  const double& m_angle;
88 };
89 
90 //! A rotation about the y axis.
91 
92 class RotationY : public IRotation
93 {
94 public:
95  RotationY(const std::vector<double> P);
96  RotationY(double angle);
97 
98  RotationY* clone() const { return new RotationY(m_angle); }
99  RotationY* createInverse() const { return new RotationY(-m_angle); }
100 
101  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
102 
103  double getAngle() const { return m_angle; }
104 
105  Transform3D getTransform3D() const;
106 
107 protected:
108  const double& m_angle;
109 };
110 
111 //! A rotation about the z axis.
112 
113 class RotationZ : public IRotation
114 {
115 public:
116  RotationZ(const std::vector<double> P);
117  RotationZ(double angle);
118 
119  RotationZ* clone() const { return new RotationZ(m_angle); }
120  RotationZ* createInverse() const { return new RotationZ(-m_angle); }
121 
122  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
123 
124  double getAngle() const { return m_angle; }
125 
126  Transform3D getTransform3D() const;
127 
128 protected:
129  const double& m_angle;
130 };
131 
132 //! A sequence of rotations about the z-x'-z'' axes.
133 
134 class RotationEuler : public IRotation
135 {
136 public:
137  RotationEuler(const std::vector<double> P);
138  RotationEuler(double alpha, double beta, double gamma);
139 
141  IRotation* createInverse() const;
142 
143  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
144 
145  double getAlpha() const { return m_alpha; }
146  double getBeta() const { return m_beta; }
147  double getGamma() const { return m_gamma; }
148 
149  Transform3D getTransform3D() const;
150 
151 protected:
153 };
154 
155 #endif // BORNAGAIN_CORE_SCATTERING_ROTATIONS_H
Defines and implements the standard mix-in ICloneable.
Defines class INode.
IRotation * createProduct(const IRotation &left, const IRotation &right)
Returns concatenated rotation (first right, then left).
Definition: Rotations.cpp:75
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:25
Visitor interface to visit ISample objects.
Definition: INodeVisitor.h:149
virtual void visit(const BasicLattice *)
Definition: INodeVisitor.h:154
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
Pure virtual interface for rotations.
Definition: Rotations.h:27
virtual IRotation * clone() const =0
virtual IRotation * createInverse() const =0
Returns a new IRotation object that is the current object's inverse.
IRotation(const NodeMeta &meta, const std::vector< double > &PValues)
Definition: Rotations.cpp:23
static IRotation * createIdentity()
Definition: Rotations.cpp:53
kvector_t transformed(const kvector_t &v) const
Definition: Rotations.cpp:58
virtual bool isIdentity() const
Returns true if rotation matrix is identity matrix (no rotations)
Definition: Rotations.cpp:63
virtual Transform3D getTransform3D() const =0
Returns transformation.
static IRotation * createRotation(const Transform3D &transform)
Definition: Rotations.cpp:28
bool zInvariant() const
Definition: Rotations.cpp:68
The identity rotation, which leaves everything in place.
Definition: Rotations.h:55
IdentityRotation * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:60
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:92
IdentityRotation * clone() const
Definition: Rotations.h:59
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:62
bool isIdentity() const
Returns true if rotation matrix is identity matrix (no rotations)
Definition: Rotations.h:66
A sequence of rotations about the z-x'-z'' axes.
Definition: Rotations.h:135
double m_beta
Definition: Rotations.h:152
double getGamma() const
Definition: Rotations.h:147
RotationEuler(const std::vector< double > P)
Definition: Rotations.cpp:163
double getBeta() const
Definition: Rotations.h:146
RotationEuler * clone() const
Definition: Rotations.h:140
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:185
double getAlpha() const
Definition: Rotations.h:145
double m_gamma
Definition: Rotations.h:152
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:143
double m_alpha
Definition: Rotations.h:152
IRotation * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.cpp:179
A rotation about the x axis.
Definition: Rotations.h:72
RotationX * clone() const
Definition: Rotations.h:77
double getAngle() const
Definition: Rotations.h:82
RotationX * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:78
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:112
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:80
const double & m_angle
Definition: Rotations.h:87
RotationX(const std::vector< double > P)
Constructor of rotation around x-axis.
Definition: Rotations.cpp:102
A rotation about the y axis.
Definition: Rotations.h:93
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:101
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:132
RotationY * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:99
double getAngle() const
Definition: Rotations.h:103
const double & m_angle
Definition: Rotations.h:108
RotationY * clone() const
Definition: Rotations.h:98
RotationY(const std::vector< double > P)
Constructor of rotation around y-axis.
Definition: Rotations.cpp:122
A rotation about the z axis.
Definition: Rotations.h:114
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:122
RotationZ * clone() const
Definition: Rotations.h:119
RotationZ * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:120
const double & m_angle
Definition: Rotations.h:129
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:154
RotationZ(const std::vector< double > P)
Constructor of rotation around z-axis.
Definition: Rotations.cpp:144
double getAngle() const
Definition: Rotations.h:124
Vector transformations in three dimensions.
Definition: Transform3D.h:28
Metadata of one model node.
Definition: INode.h:37