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)