26 #ifndef DOXYGEN_SHOULD_SKIP_THIS
68 m_Q[0] = m_Q[1] = m_Q[2] = m_Q[3] = 0;
145 conj() { m_Q[1] = -m_Q[1]; m_Q[2] = -m_Q[2]; m_Q[3] = -m_Q[3]; }
161 real_type bf = 1/(m_Q[0]*m_Q[0] + m_Q[1]*m_Q[1] + m_Q[2]*m_Q[2] + m_Q[3]*m_Q[3]);
162 m_Q[0] *= bf; bf = -bf; m_Q[1] *= bf; m_Q[2] *= bf; m_Q[3] *= bf;
176 return sqrt(m_Q[0]*m_Q[0] + m_Q[1]*m_Q[1] + m_Q[2]*m_Q[2] + m_Q[3]*m_Q[3]);
193 w[0] = ( m_Q[0] * m_Q[0] + m_Q[1] * m_Q[1] ) * v[0]
194 + ( m_Q[1] * m_Q[2] - m_Q[0] * m_Q[3] ) * v[1]
195 + ( m_Q[1] * m_Q[3] + m_Q[0] * m_Q[2] ) * v[2];
197 w[1] = ( m_Q[1] * m_Q[2] + m_Q[0] * m_Q[3] ) * v[0]
198 + ( m_Q[0] * m_Q[0] + m_Q[2] * m_Q[2] ) * v[1]
199 + ( m_Q[2] * m_Q[3] - m_Q[0] * m_Q[1] ) * v[2];
201 w[2] = ( m_Q[1] * m_Q[3] - m_Q[0] * m_Q[2] ) * v[0]
202 + ( m_Q[2] * m_Q[3] + m_Q[0] * m_Q[1] ) * v[1]
203 + ( m_Q[0] * m_Q[0] + m_Q[3] * m_Q[3] ) * v[2];
205 w[0] = 2*w[0] - v[0];
206 w[1] = 2*w[1] - v[1];
207 w[2] = 2*w[2] - v[2];
233 real_type sin_phi = sqrt( m_Q[1]*m_Q[1] + m_Q[2]*m_Q[2] + m_Q[3]*m_Q[3] );
235 real_type angle = 2 * atan2( sin_phi, cos_phi );
236 if ( sin_phi == 0 ) {
237 axis[0] = 1; axis[1] = axis[2] = 0;
239 axis[0] = m_Q[1] / sin_phi;
240 axis[1] = m_Q[2] / sin_phi;
241 axis[2] = m_Q[3] / sin_phi;
258 mat[0][0] = axis[0] * axis[0] + ca * ( 1 - axis[0] * axis[0] );
259 mat[1][0] = ( 1 - ca ) * axis[0] * axis[1] - sa * axis[2];
260 mat[2][0] = ( 1 - ca ) * axis[0] * axis[2] + sa * axis[1];
262 mat[0][1] = ( 1 - ca ) * axis[1] * axis[0] + sa * axis[2];
263 mat[1][1] = axis[1] * axis[1] + ca * ( 1 - axis[1] * axis[1] );
264 mat[2][1] = ( 1 - ca ) * axis[1] * axis[2] - sa * axis[0];
266 mat[0][2] = ( 1 - ca ) * axis[2] * axis[0] - sa * axis[1];
267 mat[1][2] = ( 1 - ca ) * axis[2] * axis[1] + sa * axis[0];
268 mat[2][2] = axis[2] * axis[2] + ca * ( 1 - axis[2] * axis[2] );
295 template <
typename T>
299 return Quaternion<T>( a[0] * b[0] - a[1] * b[1] - a[2] * b[2] - a[3] * b[3],
300 a[0] * b[1] + a[1] * b[0] + a[2] * b[3] - a[3] * b[2],
301 a[0] * b[2] - a[1] * b[3] + a[2] * b[0] + a[3] * b[1],
302 a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + a[3] * b[0] );
312 template <
typename T>
Implement some operationn on quaternion.
Definition Quaternion.hxx:52
real_type norm() const
Definition Quaternion.hxx:175
real_type to_axis(real_type axis[3]) const
Definition Quaternion.hxx:232
void rotate(real_type const v[3], real_type w[3]) const
Definition Quaternion.hxx:192
T real_type
Definition Quaternion.hxx:57
void print(ostream_type &os) const
Definition Quaternion.hxx:118
Quaternion(real_type A, real_type B, real_type C, real_type D)
Definition Quaternion.hxx:79
void to_matrix(real_type mat[3][3]) const
Definition Quaternion.hxx:252
void invert()
Definition Quaternion.hxx:160
Quaternion()
Definition Quaternion.hxx:67
void setup(real_type A, real_type B, real_type C, real_type D)
Definition Quaternion.hxx:100
void conj()
Definition Quaternion.hxx:145
real_type operator[](int i) const
Definition Quaternion.hxx:133
Definition SystemUtils.cc:39
Quaternion< T > operator*(Quaternion< T > const &a, Quaternion< T > const &b)
Definition Quaternion.hxx:298
std::basic_ostream< char > ostream_type
Type for output stream.
Definition Console.hxx:28
ostream_type & operator<<(ostream_type &os, Quaternion< T > const &Q)
Definition Quaternion.hxx:314