template<typename T>
LinAl::Matrix<T, 3, 3> Quaternion<T>::to_matrix() const
{
- T s = 2*(a*a+b*b+c*c+d*d);
+ T n = a*a+b*b+c*c+d*d;
+ T s = n>std::numeric_limits<T>::epsilon()*4 ? T(2)/(n) : T();
LinAl::Vector<T, 3> columns[3] =
{
- { 1-s*(c*c+d*d), s*(b*c+a*d), s*(b*d-a*c) },
- { s*(b*c-a*d), 1-s*(b*b+d*d), s*(c*d+a*b) },
- { s*(b*d+a*c), s*(c*d-a*b), 1-s*(b*b+c*c) }
+ { T(1)-s*(c*c+d*d), s*(b*c+a*d), s*(b*d-a*c) },
+ { s*(b*c-a*d), T(1)-s*(b*b+d*d), s*(c*d+a*b) },
+ { s*(b*d+a*c), s*(c*d-a*b), T(1)-s*(b*b+c*c) }
};
return LinAl::Matrix<T, 3, 3>::from_columns(columns);
}