Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1.  
  2. // Symmetric point-to-plane alignment.
  3. static bool align_symm(const ::std::vector<PtPair> &pairs,
  4.     float scale, point &centroid1, point &centroid2, xform &alignxf)
  5. {
  6.     size_t npairs = pairs.size();
  7.     double A[6][6] = { { 0 } }, b[6] = { 0 };
  8.  
  9.     for (size_t i = 0; i < npairs; i++) {
  10.         dvec3 p1 = dvec3(scale * (pairs[i].p1 - centroid1));
  11.         dvec3 p2 = dvec3(scale * (pairs[i].p2 - centroid2));
  12.         dvec3 n = dvec3(pairs[i].n1 + pairs[i].n2);
  13.         dvec3 p = p1 + p2;
  14.         dvec3 c = p CROSS n;
  15.         dvec3 d = p1 - p2;
  16.  
  17.         double x[6] = { c[0], c[1], c[2], n[0], n[1], n[2] };
  18.         double dn = d DOT n;
  19.  
  20.         for (int j = 0; j < 6; j++) {
  21.             b[j] += dn * x[j];
  22.             for (int k = j; k < 6; k++)
  23.                 A[j][k] += x[j] * x[k];
  24.         }
  25.     }
  26.  
  27.     // Make matrix symmetric
  28.     for (int j = 1; j < 6; j++)
  29.         for (int k = 0; k < j; k++)
  30.             A[j][k] = A[k][j];
  31.  
  32.     // Eigen-decomposition and inverse
  33.     double eval[6], einv[6];
  34.     eigdc<double,6>(A, eval);
  35.     for (int i = 0; i < 6; i++) {
  36.         if (eval[i] < 1e-6)
  37.             return false;
  38.         else
  39.             einv[i] = 1.0 / eval[i];
  40.     }
  41.  
  42.     // Solve system
  43.     eigmult<double,6>(A, einv, b);
  44.  
  45.     // Extract rotation and translation
  46.     dvec3 rot(b[0], b[1], b[2]), trans(b[3], b[4], b[5]);
  47.     double rotangle = atan(len(rot));
  48.     trans *= 1.0 / scale;
  49.     trans *= cos(rotangle);
  50.  
  51.     xform R = xform::rot(rotangle, rot);
  52.     alignxf = xform::trans(centroid1) *
  53.               R * xform::trans(trans) * R *
  54.               xform::trans(-centroid2);
  55.  
  56.     return true;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement