예제 #1
0
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;
}
예제 #2
0
/**
 * \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);
	}
}