14 #ifndef _QUATERNION_HPP
15 #define _QUATERNION_HPP
21 #include "Foundation/Quaternion.h"
22 #include "Foundation/vec3.h"
23 #include "Foundation/Matrix3.h"
33 QUATERNION_INLINE Quaternion::Quaternion()
39 QUATERNION_INLINE Quaternion::Quaternion(
double d,
const Vec3 &v)
45 QUATERNION_INLINE Quaternion::Quaternion(
const Quaternion & q)
62 if (&q ==
this)
return *
this;
78 QUATERNION_INLINE std::ostream& operator<<(std::ostream& co,
const Quaternion& q)
83 QUATERNION_INLINE std::istream& operator>>(std::istream& ci,
Quaternion& q)
88 QUATERNION_INLINE std::ostream& Quaternion::output(std::ostream& co)
const
97 QUATERNION_INLINE std::istream& Quaternion::input(std::istream& ci)
106 QUATERNION_INLINE
bool Quaternion::operator==(
const Quaternion &q)
const
110 (return_sca() == q.return_sca())
112 (return_vec() == q.return_vec())
116 QUATERNION_INLINE
bool Quaternion::operator!=(
const Quaternion &q)
const
118 return !(*
this == q);
134 qq.scalar = scalar + q2.scalar;
135 qq.vector = vector + q2.vector;
137 return Quaternion(scalar + q2.scalar, vector + q2.vector);
145 qq.scalar = scalar - q2.scalar;
146 qq.vector = vector - q2.vector;
148 return Quaternion(scalar-q2.scalar, vector-q2.vector);
151 QUATERNION_INLINE
Quaternion Quaternion::operator-()
const
167 qq.scalar = c * q.scalar;
168 qq.vector = c * q.vector;
173 QUATERNION_INLINE
Quaternion Quaternion::operator*(
double c)
const
183 qq.scalar = scalar * q2.scalar - dot(vector, q2.vector);
184 qq.vector = scalar * q2.vector
186 + cross(vector, q2.vector);
190 scalar * q2.scalar - dot(vector, q2.vector),
193 + cross(vector, q2.vector)
197 QUATERNION_INLINE
Quaternion Quaternion::inverse()
const
204 return *
this * q2.inverse();
223 QUATERNION_INLINE
Quaternion& Quaternion::operator*=(
double c)
233 const double s = scalar * q.scalar - dot(vector, q.vector);
234 vector = scalar * q.vector
236 + cross(vector, q.vector);
246 const double s = scalar * qq.scalar - dot(vector, qq.vector);
247 vector = scalar * qq.vector
249 + cross(vector, qq.vector);
256 QUATERNION_INLINE
void Quaternion::normalize()
258 double len = length();
267 QUATERNION_INLINE
double Quaternion::length()
const
269 const double vlen = vector.norm();
270 return sqrt(scalar * scalar + vlen * vlen);
273 QUATERNION_INLINE
Matrix3 Quaternion::to_matrix()
const
277 m[0][0] = scalar*scalar + vector.X()*vector.X()
278 - vector.Y()*vector.Y() -vector.Z()*vector.Z();
279 m[0][1] = 2*(vector.X()*vector.Y() + scalar*vector.Z());
280 m[0][2] = 2*(vector.X()*vector.Z() - scalar*vector.Y());
281 m[1][0] = 2*(vector.X()*vector.Y() - scalar*vector.Z());
282 m[1][1] = scalar*scalar - vector.X()*vector.X()
283 + vector.Y()*vector.Y() - vector.Z()*vector.Z();
284 m[1][2] = 2*(vector.Y()*vector.Z() + scalar*vector.X());
285 m[2][0] = 2*(vector.X()*vector.Z() + scalar*vector.Y());
286 m[2][1] = 2*(vector.Y()*vector.Z() - scalar*vector.X());
287 m[2][2] = scalar*scalar - vector.X()*vector.X()
288 - vector.Y()*vector.Y() + vector.Z()*vector.Z();
313 Vec3 v(this->vector);
314 return (v *= (2*acos(this->scalar)/v.norm()));
322 #endif // _QUATERNION_HPP