74 template<
typename Type>
88 const Type& q1 = Type(),
89 const Type& q2 = Type(),
90 const Type& q3 = Type());
102 template<
typename Type2>
132 Type
const &
operator()(
const int index)
const;
200 template<
typename Type2>
214 template<
typename Type2>
228 template<
typename Type2>
242 template<
typename Type2>
256 template<
typename Type2>
267 template<
typename Type>
280 template<
typename Type>
281 template<
typename Type2>
291 template<
typename Type>
294 if (index < 0 || index > 3)
296 std::stringstream errmsg;
297 errmsg <<
"Index exceeds quaternion size\n" 298 <<
" Index must be between 0 and 3 - got " << index;
299 std::out_of_range err(errmsg.str());
305 template<
typename Type>
308 if (index < 0 || index > 3)
310 std::stringstream errmsg;
311 errmsg <<
"Index exceeds quaternion size\n" 312 <<
" Index must be between 0 and 3 - got " << index;
313 std::out_of_range err(errmsg.str());
319 template<
typename Type>
330 template<
typename Type>
338 template<
typename Type>
346 template<
typename Type>
357 template<
typename Type>
368 template<
typename Type>
369 template<
typename Type2>
380 template<
typename Type>
381 template<
typename Type2>
392 template<
typename Type>
393 template<
typename Type2>
404 template<
typename Type>
405 template<
typename Type2>
409 const Type a = _quat[0] * t(0) - _quat[1] * t(1) -
410 _quat[2] * t(2) - _quat[3] * t(3);
411 const Type b = _quat[0] * t(1) + _quat[1] * t(0) +
412 _quat[2] * t(3) - _quat[3] * t(2);
413 const Type c = _quat[0] * t(2) - _quat[1] * t(3) +
414 _quat[2] * t(0) + _quat[3] * t(1);
415 _quat[3] = _quat[0] * t(3) + _quat[1] * t(2) -
416 _quat[2] * t(1) + _quat[3] * t(0);
423 template<
typename Type>
424 template<
typename Type2>
429 *
this /= t(0) * t(0) + t(1) * t(1) + t(2) * t(2) + t(3) * t(3);
448 template<
typename Type>
468 template<
typename Type>
488 template<
typename Type>
508 template<
typename Type>
528 template<
typename Type>
548 template<
typename Type>
568 template<
typename Type>
588 template<
typename Type>
608 template<
typename Type>
628 template<
typename Type>
648 template<
typename Type>
668 template<
typename Type>
687 template<
typename Type>
705 template<
typename Type>
724 template<
typename Type>
729 return t1(0) == t2(0) && t1(1) == t2(1) &&
730 t1(2) == t2(2) && t1(3) == t2(3);
745 template<
typename Type>
750 return t1(0) == t2 && t1(1) == Type() &&
751 t1(2) == Type() && t1(3) == Type();
766 template<
typename Type>
771 return t1 == t2(0) && t2(1) == Type() &&
772 t2(2) == Type() && t2(3) == Type();
787 template<
typename Type>
792 return t1(0) != t2(0) || t1(1) != t2(1) ||
793 t1(2) != t2(2) || t1(3) != t2(3);
808 template<
typename Type>
813 return t1(0) != t2 || t1(1) != Type() ||
814 t1(2) != Type() || t1(3) != Type();
829 template<
typename Type>
834 return t1 != t2(0) || t2(1) != Type() ||
835 t2(2) != Type() || t2(3) != Type();
850 template<
typename Type,
typename CharT,
class Traits>
851 std::basic_istream<CharT, Traits>&
870 else is.setstate(std::ios_base::failbit);
872 else is.setstate(std::ios_base::failbit);
874 else is.setstate(std::ios_base::failbit);
876 else is.setstate(std::ios_base::failbit);
899 template<
typename Type,
typename CharT,
class Traits>
900 std::basic_ostream<CharT, Traits>&
903 std::basic_ostringstream<CharT, Traits> s;
905 s.imbue(os.getloc());
906 s.precision(os.precision());
907 s <<
'(' << t(0) <<
',' << t(1) <<
',' << t(2) <<
',' << t(3) <<
')';
908 return os << s.str();
922 template<
typename Type>
926 return std::sqrt(t(0) * t(0) + t(1) * t(1) +
927 t(2) * t(2) + t(3) * t(3));
943 template<
typename Type>
bool operator!=(const Type &t1, const Quaternion< Type > &t2)
Type abs(const Quaternion< Type > &t)
Quaternion< Type > & operator+=(Type const &scalar)
Add the given real number to this quaternion.
Quaternion< Type > operator-(const Quaternion< Type > &t)
Quaternion< Type > operator/(const Quaternion< Type > &t1, const Type &t2)
Quaternion(const Type &q0=Type(), const Type &q1=Type(), const Type &q2=Type(), const Type &q3=Type())
Create a new quaternion .
bool operator==(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
The Quaternion class implements templated quaternions with few important operations.
std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &is, Quaternion< Type > &t)
Quaternion< Type > operator*(const Type &t1, const Quaternion< Type > &t2)
bool operator!=(const Quaternion< Type > &t1, const Type &t2)
Quaternion< Type > & operator-=(Type const &scalar)
Subtract the given real number from this quaternion.
bool operator==(const Type &t1, const Quaternion< Type > &t2)
Quaternion< Type > operator*(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
bool operator!=(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
Type & operator()(const int index)
Get a reference to the coefficient for the given quaternion dimension.
Quaternion< Type > operator+(const Type &t1, const Quaternion< Type > &t2)
Quaternion< Type > & operator/=(Type const &scalar)
Divide this quaternion by the given scalar value.
bool operator==(const Quaternion< Type > &t1, const Type &t2)
Quaternion< Type > & operator*=(Type const &scalar)
Scale this quaternion with the given scalar value.
Quaternion< Type > operator-(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
Quaternion< Type > & operator=(Type const &scalar)
Set this quaternion to the given real number.
Quaternion< Type > operator+(const Quaternion< Type > &t)
Quaternion< Type > operator-(const Quaternion< Type > &t1, const Type &t2)
Quaternion< Type > operator+(const Quaternion< Type > &t1, const Type &t2)
Quaternion< Type > operator+(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
Quaternion< Type > operator-(const Type &t1, const Quaternion< Type > &t2)
Quaternion< Type > conj(const Quaternion< Type > &t)
Quaternion< Type > operator/(const Type &t1, const Quaternion< Type > &t2)
Quaternion< Type > operator/(const Quaternion< Type > &t1, const Quaternion< Type > &t2)
Quaternion< Type > operator*(const Quaternion< Type > &t1, const Type &t2)