OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
CoordinateSystemTrafo.h
Go to the documentation of this file.
1#ifndef COORDINATESYSTEMTRAFO
2#define COORDINATESYSTEMTRAFO
3
5
7public:
9
11
12 CoordinateSystemTrafo(const ippl::Vector<double, 3>& origin, const Quaternion& orientation);
13
14 ippl::Vector<double, 3> transformTo(const ippl::Vector<double, 3>& r) const;
15 ippl::Vector<double, 3> transformFrom(const ippl::Vector<double, 3>& r) const;
16
17 ippl::Vector<double, 3> rotateTo(const ippl::Vector<double, 3>& r) const;
18 ippl::Vector<double, 3> rotateFrom(const ippl::Vector<double, 3>& r) const;
19
20 void invert();
22
25 void operator*=(const CoordinateSystemTrafo& right);
26
27 ippl::Vector<double, 3> getOrigin() const;
28 Quaternion getRotation() const;
29
31
32 void print(std::ostream&) const;
33
34private:
35 ippl::Vector<double, 3> origin_m;
38};
39
40inline std::ostream& operator<<(std::ostream& os, const CoordinateSystemTrafo& trafo) {
41 trafo.print(os);
42 return os;
43}
44
45inline Inform& operator<<(Inform& os, const CoordinateSystemTrafo& trafo) {
46 trafo.print(os.getStream());
47 return os;
48}
49
50inline void CoordinateSystemTrafo::print(std::ostream& os) const {
51 os << "Origin: " << origin_m << "\n"
52 << "z-axis: " << orientation_m.conjugate().rotate(ippl::Vector<double, 3>(0, 0, 1)) << "\n"
53 << "x-axis: " << orientation_m.conjugate().rotate(ippl::Vector<double, 3>(1, 0, 0));
54}
55
56inline ippl::Vector<double, 3> CoordinateSystemTrafo::getOrigin() const {
57 return origin_m;
58}
59
63
64
68
70 CoordinateSystemTrafo result(*this);
71 result.invert();
72
73 return result;
74}
75
76inline ippl::Vector<double, 3> CoordinateSystemTrafo::transformTo(
77 const ippl::Vector<double, 3>& r) const {
78 const ippl::Vector<double, 3> delta = r - origin_m;
80}
81
82inline ippl::Vector<double, 3> CoordinateSystemTrafo::transformFrom(
83 const ippl::Vector<double, 3>& r) const {
84 return rotateFrom(r) + origin_m;
85}
86
87inline ippl::Vector<double, 3> CoordinateSystemTrafo::rotateTo(
88 const ippl::Vector<double, 3>& r) const {
90}
91
92inline ippl::Vector<double, 3> CoordinateSystemTrafo::rotateFrom(
93 const ippl::Vector<double, 3>& r) const {
94 return prod_boost_vector(boost::numeric::ublas::trans(rotationMatrix_m), r);
95}
96
97#endif
std::ostream & operator<<(std::ostream &os, const CoordinateSystemTrafo &trafo)
boost::numeric::ublas::matrix< double > matrix_t
Definition BoostMatrix.h:23
T prod_boost_vector(boost::numeric::ublas::matrix< double > rotation, const T &vect)
Definition BoostMatrix.h:26
ippl::Vector< double, 3 > getOrigin() const
ippl::Vector< double, 3 > transformFrom(const ippl::Vector< double, 3 > &r) const
ippl::Vector< double, 3 > rotateFrom(const ippl::Vector< double, 3 > &r) const
ippl::Vector< double, 3 > rotateTo(const ippl::Vector< double, 3 > &r) const
void operator*=(const CoordinateSystemTrafo &right)
matrix_t getRotationMatrix() const
CoordinateSystemTrafo & operator=(const CoordinateSystemTrafo &right)=default
ippl::Vector< double, 3 > transformTo(const ippl::Vector< double, 3 > &r) const
void print(std::ostream &) const
CoordinateSystemTrafo inverted() const
ippl::Vector< double, 3 > origin_m
CoordinateSystemTrafo operator*(const CoordinateSystemTrafo &right) const
Quaternion getRotation() const