18 Real d = (A(p, p) - A(q, q)) / (2.0f*A(p, q));
19 Real t = 1.0f / (fabs(d) +
sqrt(d*d + 1.0f));
25 A(p, q) = A(q, p) = 0.0f;
28 for (k = 0; k < 3; k++) {
29 if (k != p && k != q) {
30 Real Akp = c*A(k, p) + s*A(k, q);
31 Real Akq = -s*A(k, p) + c*A(k, q);
32 A(k, p) = A(p, k) = Akp;
33 A(k, q) = A(q, k) = Akq;
37 for (k = 0; k < 3; k++) {
38 Real Rkp = c*R(k, p) + s*R(k, q);
39 Real Rkq = -s*R(k, p) + c*R(k, q);
85 DYN_FUNC
void polarDecomposition(
const SquareMatrix<Real, 3> &A, SquareMatrix<Real, 3> &R, SquareMatrix<Real, 3> &U, SquareMatrix<Real, 3> &D, SquareMatrix<Real, 3> &
V)
91 svd(A(0, 0), A(0, 1), A(0, 2), A(1, 0), A(1, 1), A(1, 2), A(2, 0), A(2, 1), A(2, 2),
92 U(0, 0), U(0, 1), U(0, 2), U(1, 0), U(1, 1), U(1, 2), U(2, 0), U(2, 1), U(2, 2),
257 AAT(0, 0) = A(0, 0)*A(0, 0) + A(0, 1)*A(0, 1) + A(0, 2)*A(0, 2);
258 AAT(1, 1) = A(1, 0)*A(1, 0) + A(1, 1)*A(1, 1) + A(1, 2)*A(1, 2);
259 AAT(2, 2) = A(2, 0)*A(2, 0) + A(2, 1)*A(2, 1) + A(2, 2)*A(2, 2);
261 AAT(0, 1) = A(0, 0)*A(1, 0) + A(0, 1)*A(1, 1) + A(0, 2)*A(1, 2);
262 AAT(0, 2) = A(0, 0)*A(2, 0) + A(0, 1)*A(2, 1) + A(0, 2)*A(2, 2);
263 AAT(1, 2) = A(1, 0)*A(2, 0) + A(1, 1)*A(2, 1) + A(1, 2)*A(2, 2);
265 AAT(1, 0) = AAT(0, 1);
266 AAT(2, 0) = AAT(0, 2);
267 AAT(2, 1) = AAT(1, 2);
281 const Real eps = 1e-15f;
283 Real l0 = eigenVals[0];
if (l0 <= eps) l0 = 0.0f;
else l0 = 1.0f / d0;
284 Real l1 = eigenVals[1];
if (l1 <= eps) l1 = 0.0f;
else l1 = 1.0f / d1;
285 Real l2 = eigenVals[2];
if (l2 <= eps) l2 = 0.0f;
else l2 = 1.0f / d2;
288 S1(0, 0) = l0*U(0, 0)*U(0, 0) + l1*U(0, 1)*U(0, 1) + l2*U(0, 2)*U(0, 2);
289 S1(1, 1) = l0*U(1, 0)*U(1, 0) + l1*U(1, 1)*U(1, 1) + l2*U(1, 2)*U(1, 2);
290 S1(2, 2) = l0*U(2, 0)*U(2, 0) + l1*U(2, 1)*U(2, 1) + l2*U(2, 2)*U(2, 2);
292 S1(0, 1) = l0*U(0, 0)*U(1, 0) + l1*U(0, 1)*U(1, 1) + l2*U(0, 2)*U(1, 2);
293 S1(0, 2) = l0*U(0, 0)*U(2, 0) + l1*U(0, 1)*U(2, 1) + l2*U(0, 2)*U(2, 2);
294 S1(1, 2) = l0*U(1, 0)*U(2, 0) + l1*U(1, 1)*U(2, 1) + l2*U(1, 2)*U(2, 2);
307 c0[0] = R(0, 0); c1[0] = R(0, 1); c2[0] = R(0, 2);
308 c0[1] = R(1, 0); c1[1] = R(1, 1); c2[1] = R(1, 2);
309 c0[2] = R(2, 0); c1[2] = R(2, 1); c2[2] = R(2, 2);
311 if (c0.normSquared() < eps)
313 else if (c1.normSquared() < eps)
320 R(0, 0) = c0[0]; R(0, 1) = c1[0]; R(0, 2) = c2[0];
321 R(1, 0) = c0[1]; R(1, 1) = c1[1]; R(1, 2) = c2[1];
322 R(2, 0) = c0[2]; R(2, 1) = c1[2]; R(2, 2) = c2[2];
329 Real Mone =
M.oneNorm();
330 Real Minf =
M.infNorm();
335 MadjTt.setRow(0, Mt.row(1).cross(Mt.row(2)));
336 MadjTt.setRow(1, Mt.row(2).cross(Mt.row(0)));
337 MadjTt.setRow(2, Mt.row(0).cross(Mt.row(1)));
339 Real det = Mt(0, 0) * MadjTt(0, 0) + Mt(1, 0) * MadjTt(1, 0) + Mt(2, 0) * MadjTt(2, 0);
341 if (fabs(det) < 1.0e-12)
344 unsigned int index = 0xffffffff;
345 for (
unsigned int i = 0; i < 3; i++)
347 len[i] = MadjTt.col(i).norm();
348 if (len[i] > 1.0e-12)
356 if (index == 0xffffffff)
363 Mt.setRow(index, Mt.row((index + 1) % 3).cross(Mt.row((index + 2) % 3)));
364 MadjTt.setRow((index + 1) % 3, Mt.row((index + 2) % 3).cross(Mt.row((index) % 3)));
365 MadjTt.setRow((index + 2) % 3, Mt.row((index) % 3).cross(Mt.row((index + 1) % 3)));
369 det = Mt(0, 0) * MadjTt(0, 0) + Mt(1, 0) * MadjTt(1, 0) + Mt(2, 0) * MadjTt(2, 0);
373 const Real MadjTone = MadjTt.oneNorm();
374 const Real MadjTinf = MadjTt.infNorm();
376 const Real gamma =
sqrt(
sqrt((MadjTone*MadjTinf) / (Mone*Minf)) / fabs(det));
378 const Real g1 = gamma*0.5f;
379 const Real g2 = 0.5f / (gamma*det);
381 for (
unsigned char i = 0; i < 3; i++)
383 for (
unsigned char j = 0; j < 3; j++)
386 Mt(i, j) = g1*Mt(i, j) + g2*MadjTt(i, j);
387 Et(i, j) -= Mt(i, j);
395 }
while (Eone > Mone * tolerance);
__host__ __forceinline__ void svd(float a11, float a12, float a13, float a21, float a22, float a23, float a31, float a32, float a33, float &u11, float &u12, float &u13, float &u21, float &u22, float &u23, float &u31, float &u32, float &u33, float &s11, float &s22, float &s33, float &v11, float &v12, float &v13, float &v21, float &v22, float &v23, float &v31, float &v32, float &v33)