29 Rotation3D::Rotation3D()
32 fM[kXX] = 1.0; fM[kXY] = 0.0; fM[kXZ] = 0.0;
33 fM[kYX] = 0.0; fM[kYY] = 1.0; fM[kYZ] = 0.0;
34 fM[kZX] = 0.0; fM[kZY] = 0.0; fM[kZZ] = 1.0;
38 void Rotation3D::Rectify()
48 double m11 = fM[kXX]*fM[kXX] + fM[kYX]*fM[kYX] + fM[kZX]*fM[kZX];
49 double m12 = fM[kXX]*fM[kXY] + fM[kYX]*fM[kYY] + fM[kZX]*fM[kZY];
50 double m13 = fM[kXX]*fM[kXZ] + fM[kYX]*fM[kYZ] + fM[kZX]*fM[kZZ];
51 double m22 = fM[kXY]*fM[kXY] + fM[kYY]*fM[kYY] + fM[kZY]*fM[kZY];
52 double m23 = fM[kXY]*fM[kXZ] + fM[kYY]*fM[kYZ] + fM[kZY]*fM[kZZ];
53 double m33 = fM[kXZ]*fM[kXZ] + fM[kYZ]*fM[kYZ] + fM[kZZ]*fM[kZZ];
57 double u11 = std::sqrt(m11);
60 double u22 = std::sqrt(m22-u21*u21);
61 double u32 = (m23-m12*m13/m11)/u22;
62 double u33 = std::sqrt(m33 - u31*u31 - u32*u32);
68 double v32 = -v33*u32/u22;
69 double v31 = -(v32*u21+v33*u31)/u11;
71 double v21 = -v22*u21/u11;
77 double n11 = v11*v11 + v21*v21 + v31*v31;
78 double n12 = v11*v21 + v21*v22 + v31*v32;
79 double n13 = v11*v31 + v21*v32 + v31*v33;
80 double n22 = v21*v21 + v22*v22 + v32*v32;
81 double n23 = v21*v31 + v22*v32 + v32*v33;
82 double n33 = v31*v31 + v32*v32 + v33*v33;
88 std::copy(fM, &fM[9], mA);
90 fM[kXX] = mA[kXX]*n11 + mA[kXY]*n12 + mA[kXZ]*n13;
91 fM[kXY] = mA[kXX]*n12 + mA[kXY]*n22 + mA[kXZ]*n23;
92 fM[kXZ] = mA[kXX]*n13 + mA[kXY]*n23 + mA[kXZ]*n33;
93 fM[kYX] = mA[kYX]*n11 + mA[kYY]*n12 + mA[kYZ]*n13;
94 fM[kYY] = mA[kYX]*n12 + mA[kYY]*n22 + mA[kYZ]*n23;
95 fM[kYZ] = mA[kYX]*n13 + mA[kYY]*n23 + mA[kYZ]*n33;
96 fM[kZX] = mA[kZX]*n11 + mA[kZY]*n12 + mA[kZZ]*n13;
97 fM[kZY] = mA[kZX]*n12 + mA[kZY]*n22 + mA[kZZ]*n23;
98 fM[kZZ] = mA[kZX]*n13 + mA[kZY]*n23 + mA[kZZ]*n33;
104 static inline void swap(
double & a,
double & b) {
106 double t=b; b=a; a=t;
109 void Rotation3D::Invert() {
111 swap (fM[kXY], fM[kYX]);
112 swap (fM[kXZ], fM[kZX]);
113 swap (fM[kYZ], fM[kZY]);
117 Rotation3D Rotation3D::operator * (
const AxisAngle & a)
const {
119 return operator* ( Rotation3D(a) );
122 Rotation3D Rotation3D::operator * (
const EulerAngles & e)
const {
124 return operator* ( Rotation3D(e) );
127 Rotation3D Rotation3D::operator * (
const Quaternion & q)
const {
129 return operator* ( Rotation3D(q) );
132 Rotation3D Rotation3D::operator * (
const RotationZYX & r)
const {
134 return operator* ( Rotation3D(r) );
137 std::ostream & operator<< (std::ostream & os,
const Rotation3D & r) {
141 r.GetComponents(m, m+9);
142 os <<
"\n" << m[0] <<
" " << m[1] <<
" " << m[2];
143 os <<
"\n" << m[3] <<
" " << m[4] <<
" " << m[5];
144 os <<
"\n" << m[6] <<
" " << m[7] <<
" " << m[8] <<
"\n";