fitplane.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:10k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <vector.h>
  5. #include "Pnt3.h"
  6. void SVD(float **, int, int, float *, float **);
  7. void
  8. fitPnt3Plane (const vector<Pnt3>& pts, Pnt3& n, float& d, Pnt3& centroid)
  9. {
  10.     int i, j;
  11.     centroid = Pnt3 (0, 0, 0);
  12.     int numPts = pts.size();
  13.     float **a = new float *[numPts];
  14.     for (i=0; i<numPts; ++i)
  15.        a[i] = new float[3];
  16.     float w[3];
  17.     float *v[3];
  18.     for (i=0; i<3; ++i)
  19.        v[i] = new float[3];
  20.     for (i = 0; i < numPts; i++) {
  21.       centroid += pts[i];
  22.     }
  23.     centroid /= numPts;
  24.     for (i = 0; i < numPts; i++) {
  25.       for (j = 0; j < 3; j++) {
  26. a[i][j] = pts[i][j] - centroid[j];
  27.       }
  28.     }
  29.     SVD(a, numPts, 3, w, v);
  30.     
  31.     // Copy vector corresponding to lowest singular value into n.
  32.     // We assume that the result from SVD is sorted.
  33.     for (j = 0; j < 3; j++)
  34.       n[j] = v[j][2];
  35.     
  36.     d = dot (n, centroid);
  37.     for (i=0; i<numPts; ++i) delete[] a[i]; delete[] a;
  38.     for (i=0; i<3; ++i) delete[] v[i];
  39. }
  40. static double at,bt,ct;
  41. #define HYPOT(a,b) ((at=fabs(a)) > (bt=fabs(b)) ? 
  42. (ct=bt/at,at*sqrt(1.0+ct*ct)) : (bt ? (ct=at/bt,bt*sqrt(1.0+ct*ct)): 0.0))
  43. //
  44. // SVD -- This function computes the singular value decomposition
  45. // of a matrix, A=UWV'.  The m x n input matrix A will have its contents
  46. // modified; the diagonal matrix of singular values W is returned in the
  47. // n-vector s (sorted in decreasing value), and the n x n matrix V (not
  48. // the transpose!) is also returned.  The function only works for m >= n.
  49. //
  50. // This function is adapted from the JAMA::SVD class in the
  51. // Template Numerical Toolkit (TNT) distributed by NIST, v1.1.1.
  52. //
  53. void SVD(float **A, int m, int n, float *s, float **V)
  54. {
  55.    if (m < n)  {
  56.       fprintf(stderr, "ERROR: SVD only valid for input matrices ");
  57.       fprintf(stderr, "with m >= n.n");
  58.       return;
  59.    }
  60.    int i, j, k;
  61.    float *e = new float[n];
  62.    float *work = new float[m];
  63.    // Reduce A to bidiagonal form, storing the diagonal elements
  64.    // in s and the super-diagonal elements in e.
  65.    int nct = min(m-1,n);
  66.    int nrt = max(0,min(n-2,m));
  67.    for (k = 0; k < max(nct,nrt); k++) {
  68.       if (k < nct) {
  69.          // Compute the transformation for the k-th column and
  70.          // place the k-th diagonal in s[k].
  71.          // Compute 2-norm of k-th column without under/overflow.
  72.          s[k] = 0;
  73.          for (i = k; i < m; i++) {
  74.             s[k] = HYPOT(s[k],A[i][k]);
  75.          }
  76.          if (s[k] != 0.0) {
  77.             if (A[k][k] < 0.0) {
  78.                s[k] = -s[k];
  79.             }
  80.             for (i = k; i < m; i++) {
  81.                A[i][k] /= s[k];
  82.             }
  83.             A[k][k] += 1.0;
  84.          }
  85.          s[k] = -s[k];
  86.       }
  87.       for (j = k+1; j < n; j++) {
  88.          if ((k < nct) && (s[k] != 0.0))  {
  89.          // Apply the transformation.
  90.             double t = 0;
  91.             for (i = k; i < m; i++) {
  92.                t += A[i][k]*A[i][j];
  93.             }
  94.             t = -t/A[k][k];
  95.             for (i = k; i < m; i++) {
  96.                A[i][j] += t*A[i][k];
  97.             }
  98.          }
  99.          // Place the k-th row of A into e for the
  100.          // subsequent calculation of the row transformation.
  101.          e[j] = A[k][j];
  102.       }
  103.       if (k < nrt) {
  104.          // Compute the k-th row transformation and place the
  105.          // k-th super-diagonal in e[k].
  106.          // Compute 2-norm without under/overflow.
  107.          e[k] = 0;
  108.          for (i = k+1; i < n; i++) {
  109.             e[k] = HYPOT(e[k],e[i]);
  110.          }
  111.          if (e[k] != 0.0) {
  112.             if (e[k+1] < 0.0) {
  113.                e[k] = -e[k];
  114.             }
  115.             for (i = k+1; i < n; i++) {
  116.                e[i] /= e[k];
  117.             }
  118.             e[k+1] += 1.0;
  119.          }
  120.          e[k] = -e[k];
  121.          if ((k+1 < m) & (e[k] != 0.0)) {
  122.          // Apply the transformation.
  123.             for (i = k+1; i < m; i++) {
  124.                work[i] = 0.0;
  125.             }
  126.             for (j = k+1; j < n; j++) {
  127.                for (i = k+1; i < m; i++) {
  128.                   work[i] += e[j]*A[i][j];
  129.                }
  130.             }
  131.             for (j = k+1; j < n; j++) {
  132.                double t = -e[j]/e[k+1];
  133.                for (i = k+1; i < m; i++) {
  134.                   A[i][j] += t*work[i];
  135.                }
  136.             }
  137.          }
  138.          // Place the transformation in V for subsequent
  139.          // back multiplication.
  140.          for (i = k+1; i < n; i++) {
  141.             V[i][k] = e[i];
  142.          }
  143.       }
  144.    }
  145.    // Set up the final bidiagonal matrix or order p.
  146.    int p = min(n,m+1);
  147.    if (nct < n) {
  148.       s[nct] = A[nct][nct];
  149.    }
  150.    if (m < p) {
  151.       s[p-1] = 0.0;
  152.    }
  153.    if (nrt+1 < p) {
  154.       e[nrt] = A[nrt][p-1];
  155.    }
  156.    e[p-1] = 0.0;
  157.    // generate V
  158.    for (k = n-1; k >= 0; k--) {
  159.       if ((k < nrt) & (e[k] != 0.0)) {
  160.          for (j = k+1; j < n; j++) {
  161.             double t = 0;
  162.             for (i = k+1; i < n; i++) {
  163.                t += V[i][k]*V[i][j];
  164.             }
  165.             t = -t/V[k+1][k];
  166.             for (i = k+1; i < n; i++) {
  167.                V[i][j] += t*V[i][k];
  168.             }
  169.          }
  170.       }
  171.       for (i = 0; i < n; i++) {
  172.          V[i][k] = 0.0;
  173.       }
  174.       V[k][k] = 1.0;
  175.    }
  176.    // Main iteration loop for the singular values.
  177.    int pp = p-1;
  178.    int iter = 0;
  179.    double eps = pow(2.0,-52.0);
  180.    while (p > 0) {
  181.       int kase=0;
  182.       k=0;
  183.       // Here is where a test for too many iterations would go.
  184.       // This section of the program inspects for
  185.       // negligible elements in the s and e arrays.  On
  186.       // completion the variables kase and k are set as follows.
  187.       // kase = 1     if s(p) and e[k-1] are negligible and k<p
  188.       // kase = 2     if s(k) is negligible and k<p
  189.       // kase = 3     if e[k-1] is negligible, k<p, and
  190.       //              s(k), ..., s(p) are not negligible (qr step).
  191.       // kase = 4     if e(p-1) is negligible (convergence).
  192.       for (k = p-2; k >= -1; k--) {
  193.          if (k == -1) {
  194.             break;
  195.          }
  196.          if (fabs(e[k]) <= eps*(fabs(s[k]) + fabs(s[k+1]))) {
  197.             e[k] = 0.0;
  198.             break;
  199.          }
  200.       }
  201.       if (k == p-2) {
  202.          kase = 4;
  203.       } else {
  204.          int ks;
  205.          for (ks = p-1; ks >= k; ks--) {
  206.             if (ks == k) {
  207.                break;
  208.             }
  209.             double t = (ks != p ? fabs(e[ks]) : 0.) +
  210.                        (ks != k+1 ? fabs(e[ks-1]) : 0.);
  211.             if (fabs(s[ks]) <= eps*t)  {
  212.                s[ks] = 0.0;
  213.                break;
  214.             }
  215.          }
  216.          if (ks == k) {
  217.             kase = 3;
  218.          } else if (ks == p-1) {
  219.             kase = 1;
  220.          } else {
  221.             kase = 2;
  222.             k = ks;
  223.          }
  224.       }
  225.       k++;
  226.       // Perform the task indicated by kase.
  227.       switch (kase) {
  228.          // Deflate negligible s(p).
  229.          case 1: {
  230.             double f = e[p-2];
  231.             e[p-2] = 0.0;
  232.             for (j = p-2; j >= k; j--) {
  233.                double t = HYPOT(s[j],f);
  234.                double cs = s[j]/t;
  235.                double sn = f/t;
  236.                s[j] = t;
  237.                if (j != k) {
  238.                   f = -sn*e[j-1];
  239.                   e[j-1] = cs*e[j-1];
  240.                }
  241.                for (i = 0; i < n; i++) {
  242.                   t = cs*V[i][j] + sn*V[i][p-1];
  243.                   V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1];
  244.                   V[i][j] = t;
  245.                }
  246.             }
  247.          }
  248.          break;
  249.          // Split at negligible s(k).
  250.          case 2: {
  251.             double f = e[k-1];
  252.             e[k-1] = 0.0;
  253.             for (j = k; j < p; j++) {
  254.                double t = HYPOT(s[j],f);
  255.                double cs = s[j]/t;
  256.                double sn = f/t;
  257.                s[j] = t;
  258.                f = -sn*e[j];
  259.                e[j] = cs*e[j];
  260.             }
  261.          }
  262.          break;
  263.          // Perform one qr step.
  264.          case 3: {
  265.             // Calculate the shift.
  266.             double scale = max(max(max(max(
  267.                     fabs(s[p-1]),fabs(s[p-2])),fabs(e[p-2])),
  268.                     fabs(s[k])),fabs(e[k]));
  269.             double sp = s[p-1]/scale;
  270.             double spm1 = s[p-2]/scale;
  271.             double epm1 = e[p-2]/scale;
  272.             double sk = s[k]/scale;
  273.             double ek = e[k]/scale;
  274.             double b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;
  275.             double c = (sp*epm1)*(sp*epm1);
  276.             double shift = 0.0;
  277.             if ((b != 0.0) | (c != 0.0)) {
  278.                shift = sqrt(b*b + c);
  279.                if (b < 0.0) {
  280.                   shift = -shift;
  281.                }
  282.                shift = c/(b + shift);
  283.             }
  284.             double f = (sk + sp)*(sk - sp) + shift;
  285.             double g = sk*ek;
  286.             // Chase zeros.
  287.             for (j = k; j < p-1; j++) {
  288.                double t = HYPOT(f,g);
  289.                double cs = f/t;
  290.                double sn = g/t;
  291.                if (j != k) {
  292.                   e[j-1] = t;
  293.                }
  294.                f = cs*s[j] + sn*e[j];
  295.                e[j] = cs*e[j] - sn*s[j];
  296.                g = sn*s[j+1];
  297.                s[j+1] = cs*s[j+1];
  298.                for (i = 0; i < n; i++) {
  299.                   t = cs*V[i][j] + sn*V[i][j+1];
  300.                   V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1];
  301.                   V[i][j] = t;
  302.                }
  303.                t = HYPOT(f,g);
  304.                cs = f/t;
  305.                sn = g/t;
  306.                s[j] = t;
  307.                f = cs*e[j] + sn*s[j+1];
  308.                s[j+1] = -sn*e[j] + cs*s[j+1];
  309.                g = sn*e[j+1];
  310.                e[j+1] = cs*e[j+1];
  311.             }
  312.             e[p-2] = f;
  313.             iter = iter + 1;
  314.          }
  315.          break;
  316.          // Convergence.
  317.          case 4: {
  318.             // Make the singular values positive.
  319.             if (s[k] <= 0.0) {
  320.                s[k] = (s[k] < 0.0 ? -s[k] : 0.0);
  321.                for (i = 0; i <= pp; i++) {
  322.                   V[i][k] = -V[i][k];
  323.                }
  324.             }
  325.             // Order the singular values.
  326.             while (k < pp) {
  327.                if (s[k] >= s[k+1]) {
  328.                   break;
  329.                }
  330.                double t = s[k];
  331.                s[k] = s[k+1];
  332.                s[k+1] = t;
  333.                if (k < n-1) {
  334.                   for (i = 0; i < n; i++) {
  335.                      t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t;
  336.                   }
  337.                }
  338.                k++;
  339.             }
  340.             iter = 0;
  341.             p--;
  342.          }
  343.          break;
  344.       }
  345.    }
  346.    // Free up allocated memory
  347.    delete[] e;
  348.    delete[] work;
  349. }
  350. #undef HYPOT