OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Euclid3D.cpp
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2// $RCSfile: Euclid3D.cpp,v $
3// ------------------------------------------------------------------------
4// $Revision: 1.1.1.1 $
5// ------------------------------------------------------------------------
6// Copyright: see Copyright.readme
7// ------------------------------------------------------------------------
8//
9// Class: Euclid3D
10// Euclid3D represents an arbitrary 3-dimension translation and
11// rotation.
12//
13// ------------------------------------------------------------------------
14// Class category: BeamlineGeometry
15// ------------------------------------------------------------------------
16//
17// $Date: 2000/03/27 09:32:34 $
18// $Author: fci $
19//
20// ------------------------------------------------------------------------
21
23#include <cmath>
24
25// Class Euclid3D
26// ------------------------------------------------------------------------
27// The present implementation contains a Vector3D representing the
28// displacement, and a Matrix3D representing the rotation.
29
30Euclid3D::Euclid3D(double x, double y, double z, double vx, double vy, double vz)
31 : V(x, y, z), R(vx, vy, vz), is_identity(false) {}
32
33Euclid3D::Euclid3D(const Vector3D& vec, const Rotation3D& rot)
34 : V(vec), R(rot), is_identity(false) {}
35
36bool Euclid3D::operator==(const Euclid3D& rhs) const { return (V == rhs.V) && (R == rhs.R); }
37
38bool Euclid3D::operator!=(const Euclid3D& rhs) const { return (V != rhs.V) || (R != rhs.R); }
39
40void Euclid3D::getAll(double& x, double& y, double& z, double& vx, double& vy, double& vz) const {
41 V.getComponents(x, y, z);
42 R.getAxis(vx, vy, vz);
43}
44
45const Vector3D& Euclid3D::getVector() const { return V; }
46
47const Rotation3D& Euclid3D::getRotation() const { return R; }
48
49void Euclid3D::setX(double x) { V.setX(x); }
50
51void Euclid3D::setY(double y) { V.setY(y); }
52
53void Euclid3D::setZ(double z) { V.setZ(z); }
54
56 if (!v.isZero()) is_identity = false;
57 V = v;
58}
59
61 if (!rot.isIdentity()) is_identity = false;
62 R = rot;
63}
64
65Euclid3D Euclid3D::dot(const Euclid3D& rhs) const {
66 Euclid3D result(*this);
67 return result.dotBy(rhs);
68}
69
70const Euclid3D& Euclid3D::dotBy(const Euclid3D& rhs) {
71 V += R * rhs.V;
72 R *= rhs.R;
73 if (!rhs.is_identity) is_identity = false;
74 return *this;
75}
76
78 Euclid3D result(*this);
79 return result.dotBy(rhs);
80}
81
82const Euclid3D& Euclid3D::operator*=(const Euclid3D& rhs) { return dotBy(rhs); }
83
85 Rotation3D rot = R.inverse();
86 return Euclid3D(rot * (-V), rot);
87}
88
89bool Euclid3D::isPureTranslation() const { return R.isIdentity(); }
90
91bool Euclid3D::isPureXRotation() const { return V.isZero() && R.isPureXRotation(); }
92
93bool Euclid3D::isPureYRotation() const { return V.isZero() && R.isPureYRotation(); }
94
95bool Euclid3D::isPureZRotation() const { return V.isZero() && R.isPureZRotation(); }
96
98
99Euclid3D Euclid3D::translation(double x, double y, double z) {
100 return Euclid3D(Vector3D(x, y, z), Rotation3D::Identity());
101}
102
105 result.is_identity = angle == 0.0;
106 return result;
107}
108
111 result.is_identity = angle == 0.0;
112 return result;
113}
114
117 result.is_identity = angle == 0.0;
118 return result;
119}
Displacement and rotation in space.
Definition Euclid3D.h:67
bool is_identity
Definition Euclid3D.h:192
static Euclid3D ZRotation(double angle)
Make rotation.
Definition Euclid3D.cpp:115
void setZ(double z)
Set displacement.
Definition Euclid3D.cpp:53
void setX(double x)
Set displacement.
Definition Euclid3D.cpp:49
Vector3D V
Definition Euclid3D.h:190
bool isPureXRotation() const
Test for rotation.
Definition Euclid3D.cpp:91
void setY(double y)
Set displacement.
Definition Euclid3D.cpp:51
void getAll(double &x, double &y, double &z, double &vx, double &vy, double &vz) const
Unpack.
Definition Euclid3D.cpp:40
static Euclid3D YRotation(double angle)
Make rotation.
Definition Euclid3D.cpp:109
bool operator==(const Euclid3D &) const
Definition Euclid3D.cpp:36
Euclid3D()
Default constructor.
Definition Euclid3D.h:204
void setDisplacement(const Vector3D &V)
Set displacement.
Definition Euclid3D.cpp:55
bool operator!=(const Euclid3D &) const
Definition Euclid3D.cpp:38
const Euclid3D & operator*=(const Euclid3D &rhs)
Dot product with assign.
Definition Euclid3D.cpp:82
static Euclid3D XRotation(double angle)
Make rotation.
Definition Euclid3D.cpp:103
const Euclid3D & dotBy(const Euclid3D &rhs)
Dot product with assign.
Definition Euclid3D.cpp:70
const Vector3D & getVector() const
Get displacement.
Definition Euclid3D.cpp:45
bool isPureYRotation() const
Test for rotation.
Definition Euclid3D.cpp:93
Euclid3D inverse() const
Inverse.
Definition Euclid3D.cpp:84
void setRotation(const Rotation3D &R)
Set rotation.
Definition Euclid3D.cpp:60
static Euclid3D identity()
Make identity.
Definition Euclid3D.cpp:97
Euclid3D operator*(const Euclid3D &rhs) const
Dot product.
Definition Euclid3D.cpp:77
static Euclid3D translation(double x, double y, double z)
Make translation.
Definition Euclid3D.cpp:99
Rotation3D R
Definition Euclid3D.h:191
bool isPureZRotation() const
Test for rotation.
Definition Euclid3D.cpp:95
Euclid3D dot(const Euclid3D &rhs) const
Dot product.
Definition Euclid3D.cpp:65
bool isPureTranslation() const
Test for translation.
Definition Euclid3D.cpp:89
const Rotation3D & getRotation() const
Get rotation.
Definition Euclid3D.cpp:47
Rotation in 3-dimensional space.
Definition Rotation3D.h:45
static Rotation3D Identity()
Make identity.
bool isIdentity() const
Test for identity.
Definition Rotation3D.h:141
static Rotation3D ZRotation(double angle)
Make rotation.
static Rotation3D YRotation(double angle)
Make rotation.
Rotation3D inverse() const
Inversion.
bool isPureXRotation() const
Test for rotation.
Vector3D getAxis() const
Get axis vector.
bool isPureZRotation() const
Test for rotation.
static Rotation3D XRotation(double angle)
Make rotation.
bool isPureYRotation() const
Test for rotation.
A 3-dimension vector.
Definition Vector3D.h:30
void setY(double)
Set component.
Definition Vector3D.h:140
void setX(double)
Set component.
Definition Vector3D.h:138
void setZ(double)
Set component.
Definition Vector3D.h:142
void getComponents(double &x, double &y, double &z) const
Get components.
Definition Vector3D.cpp:81
bool isZero() const
Test for zero.
Definition Vector3D.cpp:87