BornAgain  1.19.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 reflection and scattering
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_SAMPLE_SCATTERING_ROTATIONS_H
16 #define BORNAGAIN_SAMPLE_SCATTERING_ROTATIONS_H
17 
18 #include "Base/Types/ICloneable.h"
19 #include "Param/Node/INode.h"
20 
21 class Transform3D;
22 
23 #ifndef USER_API
24 
25 //! Abstract base class for rotations.
26 //! @ingroup samples
27 
28 class IRotation : public ICloneable, public INode {
29 public:
30  static IRotation* createRotation(const Transform3D& transform);
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 #endif // USER_API
53 
54 //! The identity rotation, which leaves everything in place.
55 
56 class IdentityRotation : public IRotation // TODO RECONSIDER: merge with class IRotation
57 {
58 public:
60 
61  IdentityRotation* clone() const { return new IdentityRotation(); }
62  IdentityRotation* createInverse() const { return new IdentityRotation(); }
63 
64  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
65 
67 
68  bool isIdentity() const { return true; }
69 };
70 
71 //! A rotation about the x axis.
72 
73 class RotationX : public IRotation {
74 public:
75  RotationX(const std::vector<double> P);
76  RotationX(double angle);
77 
78  RotationX* clone() const { return new RotationX(m_angle); }
79  RotationX* createInverse() const { return new RotationX(-m_angle); }
80 
81  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
82 
83  double getAngle() const { return m_angle; }
84 
86 
87 protected:
88  const double& m_angle;
89 };
90 
91 //! A rotation about the y axis.
92 
93 class RotationY : public IRotation {
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 public:
115  RotationZ(const std::vector<double> P);
116  RotationZ(double angle);
117 
118  RotationZ* clone() const { return new RotationZ(m_angle); }
119  RotationZ* createInverse() const { return new RotationZ(-m_angle); }
120 
121  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
122 
123  double getAngle() const { return m_angle; }
124 
125  Transform3D getTransform3D() const;
126 
127 protected:
128  const double& m_angle;
129 };
130 
131 //! A sequence of rotations about the z-x'-z'' axes.
132 
133 class RotationEuler : public IRotation {
134 public:
135  RotationEuler(const std::vector<double> P);
136  RotationEuler(double alpha, double beta, double gamma);
137 
139  IRotation* createInverse() const;
140 
141  void accept(INodeVisitor* visitor) const { visitor->visit(this); }
142 
143  double getAlpha() const { return m_alpha; }
144  double getBeta() const { return m_beta; }
145  double getGamma() const { return m_gamma; }
146 
147  Transform3D getTransform3D() const;
148 
149 protected:
151 };
152 
153 #endif // BORNAGAIN_SAMPLE_SCATTERING_ROTATIONS_H
Defines and implements the standard mix-in ICloneable.
Defines interface INode.
IRotation * createProduct(const IRotation &left, const IRotation &right)
Returns concatenated rotation (first right, then left).
Definition: Rotations.cpp:70
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:25
Visitor interface to visit ISampleNode objects.
Definition: INodeVisitor.h:146
virtual void visit(const BasicLattice2D *)
Definition: INodeVisitor.h:151
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
Abstract base class for rotations.
Definition: Rotations.h:28
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
kvector_t transformed(const kvector_t &v) const
Definition: Rotations.cpp:53
virtual bool isIdentity() const
Returns true if rotation matrix is identity matrix (no rotations)
Definition: Rotations.cpp:58
virtual Transform3D getTransform3D() const =0
Returns transformation.
static IRotation * createRotation(const Transform3D &transform)
Definition: Rotations.cpp:28
bool zInvariant() const
Definition: Rotations.cpp:63
The identity rotation, which leaves everything in place.
Definition: Rotations.h:57
IdentityRotation * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:62
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:87
IdentityRotation * clone() const
Definition: Rotations.h:61
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:64
bool isIdentity() const
Returns true if rotation matrix is identity matrix (no rotations)
Definition: Rotations.h:68
A sequence of rotations about the z-x'-z'' axes.
Definition: Rotations.h:133
double m_beta
Definition: Rotations.h:150
double getGamma() const
Definition: Rotations.h:145
RotationEuler(const std::vector< double > P)
Definition: Rotations.cpp:155
double getBeta() const
Definition: Rotations.h:144
RotationEuler * clone() const
Definition: Rotations.h:138
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:179
double getAlpha() const
Definition: Rotations.h:143
double m_gamma
Definition: Rotations.h:150
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:141
double m_alpha
Definition: Rotations.h:150
IRotation * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.cpp:173
A rotation about the x axis.
Definition: Rotations.h:73
RotationX * clone() const
Definition: Rotations.h:78
double getAngle() const
Definition: Rotations.h:83
RotationX * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:79
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:106
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:81
const double & m_angle
Definition: Rotations.h:88
RotationX(const std::vector< double > P)
Constructor of rotation around x-axis.
Definition: Rotations.cpp:97
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:125
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:116
A rotation about the z axis.
Definition: Rotations.h:113
void accept(INodeVisitor *visitor) const
Calls the INodeVisitor's visit method.
Definition: Rotations.h:121
RotationZ * clone() const
Definition: Rotations.h:118
RotationZ * createInverse() const
Returns a new IRotation object that is the current object's inverse.
Definition: Rotations.h:119
const double & m_angle
Definition: Rotations.h:128
Transform3D getTransform3D() const
Returns transformation.
Definition: Rotations.cpp:146
RotationZ(const std::vector< double > P)
Constructor of rotation around z-axis.
Definition: Rotations.cpp:137
double getAngle() const
Definition: Rotations.h:123
Vector transformations in three dimensions.
Definition: Transform3D.h:26
Metadata of one model node.
Definition: INode.h:38