Mat3 mxrox (double& a, Vec3& v) { // Convert eigenvalue a (eigen angle in radians) and eigenvector v // into a corresponding cosine rotation matrix m. double q1, q2, q3, q4, q12, q22, q32, q42; Mat3 result; // calculate quaternions and their squares q4 = sin ( 0.5 * a); q1 = v[0] * q4; q2 = v[1] * q4; q3 = v[2] * q4; q4 = cos (0.5 * a); q12 = q1 * q1; q22 = q2 * q2; q32 = q3 * q3; q42 = q4 * q4; // now get the matrix elements result.assign ((q12 - q22 - q32 + q42), (2.0 * (q1*q2 + q3*q4)), (2.0 * (q1*q3 - q2*q4)), (2.0 * (q1*q2 - q3*q4)), (-q12 + q22 - q32 + q42),(2.0 * (q2*q3 + q1*q4)), (2.0 * (q1*q3 + q2*q4)), (2.0 * (q2*q3 - q1*q4)), (-q12 - q22 + q32 + q42)); return result; }