1 #ifndef math_LinearTransformations_H__
2 #define math_LinearTransformations_H__
8 #include "../geo/Vectors.h"
19 template<
class Scalar>
39 void calcMatrix()
const {
42 double angle(self->theta_.length());
43 double cs(cos(angle / 2.0));
44 double sn(sin(angle / 2.0));
50 tmp.
entry(0, 1, 2*axis.x()*axis.y()*
squ(sn) - 2*axis.z()*cs*sn);
51 tmp.
entry(1, 0, 2*axis.y()*axis.x()*
squ(sn) + 2*axis.z()*cs*sn);
52 tmp.
entry(0, 2, 2*axis.x()*axis.z()*
squ(sn) + 2*axis.y()*cs*sn);
53 tmp.
entry(2, 0, 2*axis.z()*axis.x()*
squ(sn) - 2*axis.y()*cs*sn);
54 tmp.
entry(1, 2, 2*axis.y()*axis.z()*
squ(sn) - 2*axis.x()*cs*sn);
55 tmp.
entry(2, 1, 2*axis.z()*axis.y()*
squ(sn) + 2*axis.x()*cs*sn);
57 self()->need_ =
false;
67 self()->theta_.x(Scalar(0));
68 self()->theta_.y(Scalar(0));
69 self()->theta_.z(Scalar(0));
134 Scalar
const&
theta(
size_t i)
const {
135 return self->theta_(i);
147 Scalar
const&
theta(
size_t i, Scalar
const& s) {
149 if (i == 0)
self()->theta_.x(s);
150 else if (i == 1)
self()->theta_.y(s);
151 else if (i == 2)
self()->theta_.z(s);
152 self()->need_ =
true;
165 for (
size_t i = 0; i < 3; i++) {
166 theta(i, n(i) * angle);
175 for (
size_t i = 0; i < 3; i++) {
217 if (self->need_) calcMatrix();
247 if (self->need_) calcMatrix();
324 if (self->need_) calcMatrix();
327 mid.
entry(1, 2, Scalar(-1.0));
328 mid.
entry(2, 1, Scalar( 1.0));
331 mid.
entry(0, 2, Scalar( 1.0));
332 mid.
entry(2, 0, Scalar(-1.0));
335 mid.
entry(0, 1, Scalar(-1.0));
336 mid.
entry(1, 0, Scalar( 1.0));
348 if (self->need_) calcMatrix();
359 if (self->need_) calcMatrix();
371 if (self->need_) calcMatrix();
374 mid.
entry(1, 2, Scalar(-1.0));
375 mid.
entry(2, 1, Scalar( 1.0));
378 mid.
entry(0, 2, Scalar( 1.0));
379 mid.
entry(2, 0, Scalar(-1.0));
382 mid.
entry(0, 1, Scalar(-1.0));
383 mid.
entry(1, 0, Scalar( 1.0));
396 if (self->need_) calcMatrix();
408 #endif // math_LinearTransformations_H__