qef.h
1 #ifndef _THREED_QEF_H
2 #define _THREED_QEF_H
3 
4 namespace VoxelFarm
5 {
6 
7  namespace Algebra
8  {
9 
18  class QEF
19  {
20  public:
21  static void evaluate(
22  double mat[][3], double *vec, int rows,
23  double& px, double& py, double& pz);
24 
25  // compute svd
26 
27  static void computeSVD(
28  double mat[][3], // matrix (rows x 3)
29  double u[][3], // matrix (rows x 3)
30  double v[3][3], // matrix (3x3)
31  double d[3], // vector (1x3)
32  int rows);
33 
34  // factorize
35 
36  static void factorize(
37  double mat[][3], // matrix (rows x 3)
38  double tau_u[3], // vector (1x3)
39  double tau_v[2], // vectors, (1x2)
40  int rows);
41 
42  static double factorize_hh(double *ptrs[], int n);
43 
44  // unpack
45 
46  static void unpack(
47  double u[][3], // matrix (rows x 3)
48  double v[3][3], // matrix (3x3)
49  double tau_u[3], // vector, (1x3)
50  double tau_v[2], // vector, (1x2)
51  int rows);
52 
53  // diagonalize
54 
55  static void diagonalize(
56  double u[][3], // matrix (rows x 3)
57  double v[3][3], // matrix (3x3)
58  double tau_u[3], // vector, (1x3)
59  double tau_v[2], // vector, (1x2)
60  int rows);
61 
62  static void chop(double *a, double *b, int n);
63 
64  static void qrstep(
65  double u[][3], // matrix (rows x cols)
66  double v[][3], // matrix (3 x cols)
67  double tau_u[], // vector (1 x cols)
68  double tau_v[], // vector (1 x cols - 1)
69  int rows, int cols);
70 
71  static void qrstep_middle(
72  double u[][3], // matrix (rows x cols)
73  double tau_u[], // vector (1 x cols)
74  double tau_v[], // vector (1 x cols - 1)
75  int rows, int cols, int col);
76 
77  static void qrstep_end(
78  double v[][3], // matrix (3 x 3)
79  double tau_u[], // vector (1 x 3)
80  double tau_v[], // vector (1 x 2)
81  int cols);
82 
83  static double qrstep_eigenvalue(
84  double tau_u[], // vector (1 x 3)
85  double tau_v[], // vector (1 x 2)
86  int cols);
87 
88  static void qrstep_cols2(
89  double u[][3], // matrix (rows x 2)
90  double v[][3], // matrix (3 x 2)
91  double tau_u[], // vector (1 x 2)
92  double tau_v[], // vector (1 x 1)
93  int rows);
94 
95  static void computeGivens(
96  double a, double b, double *c, double *s);
97 
98  static void computeSchur(
99  double a1, double a2, double a3,
100  double *c, double *s);
101 
102  // singularize
103 
104  static void singularize(
105  double u[][3], // matrix (rows x 3)
106  double v[3][3], // matrix (3x3)
107  double d[3], // vector, (1x3)
108  int rows);
109 
110  // solve svd
111  static void solveSVD(
112  double u[][3], // matrix (rows x 3)
113  double v[3][3], // matrix (3x3)
114  double d[3], // vector (1x3)
115  double b[], // vector (1 x rows)
116  double x[3], // vector (1x3)
117  int rows);
118  };
119 
120  }
121 }
122 #endif
Contains all classes and functions for the VoxelFarm engine.