void Rx(Matrix3x3 &out, double theta) { out.setIdentity(); double s = sin(theta); double c = cos(theta); out(1,1) = c; out(1,2) = -s; out(2,1) = s; out(2,2) = c; }
/** * \brief Fast non-iterative 3x3 eigenvalue decomposition * * Based on "Geometric Tools" by David Eberly. */ void eig3_noniter(Matrix3x3 &A, Float lambda[3]) { // Compute the eigenvalues using double-precision arithmetic. double root[3]; eig3_evals(A, root); lambda[0] = (Float) root[0]; lambda[1] = (Float) root[1]; lambda[2] = (Float) root[2]; Matrix3x3 eigs; Float maxEntry[3]; Vector maxRow[3]; for (int i = 0; i < 3; ++i) { Matrix3x3 M(A); M(0, 0) -= lambda[i]; M(1, 1) -= lambda[i]; M(2, 2) -= lambda[i]; if (!eig3_rank(M, maxEntry[i], maxRow[i])) { A.setIdentity(); return; } } Float totalMax = maxEntry[0]; int i = 0; if (maxEntry[1] > totalMax) { totalMax = maxEntry[1]; i = 1; } if (maxEntry[2] > totalMax) { i = 2; } if (i == 0) { maxRow[0] = normalize(maxRow[0]); eig3_evecs(A, lambda, maxRow[0], 1, 2, 0); } else if (i == 1) { maxRow[1] = normalize(maxRow[1]); eig3_evecs(A, lambda, maxRow[1], 2, 0, 1); } else { maxRow[2] = normalize(maxRow[2]); eig3_evecs(A, lambda, maxRow[2], 0, 1, 2); } }