124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
//----------------------------------------------------------------------------
|
|
// ThreeD Quadric Error Function
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef _THREED_QEF_H
|
|
#define _THREED_QEF_H
|
|
|
|
#include <PolyVoxCore/Vector.h>
|
|
|
|
namespace PolyVox {
|
|
|
|
/**
|
|
* QEF, implementing the quadric error function
|
|
* E[x] = P - Ni . Pi
|
|
*
|
|
* Given at least three points Pi, each with its respective
|
|
* normal vector Ni, that describe at least two planes,
|
|
* the QEF evalulates to the point x.
|
|
*/
|
|
|
|
Vector3DFloat evaluateQEF(
|
|
double mat[][3], double *vec, int rows); //TODO make these STL containers
|
|
|
|
// compute svd
|
|
|
|
void computeSVD(
|
|
double mat[][3], // matrix (rows x 3)
|
|
double u[][3], // matrix (rows x 3)
|
|
double v[3][3], // matrix (3x3)
|
|
double d[3], // vector (1x3)
|
|
int rows);
|
|
|
|
// factorize
|
|
|
|
void factorize(
|
|
double mat[][3], // matrix (rows x 3)
|
|
double tau_u[3], // vector (1x3)
|
|
double tau_v[2], // vectors, (1x2)
|
|
int rows);
|
|
|
|
double factorize_hh(double *ptrs[], int n);
|
|
|
|
// unpack
|
|
|
|
void unpack(
|
|
double u[][3], // matrix (rows x 3)
|
|
double v[3][3], // matrix (3x3)
|
|
double tau_u[3], // vector, (1x3)
|
|
double tau_v[2], // vector, (1x2)
|
|
int rows);
|
|
|
|
// diagonalize
|
|
|
|
void diagonalize(
|
|
double u[][3], // matrix (rows x 3)
|
|
double v[3][3], // matrix (3x3)
|
|
double tau_u[3], // vector, (1x3)
|
|
double tau_v[2], // vector, (1x2)
|
|
int rows);
|
|
|
|
void chop(double *a, double *b, int n);
|
|
|
|
void qrstep(
|
|
double u[][3], // matrix (rows x cols)
|
|
double v[][3], // matrix (3 x cols)
|
|
double tau_u[], // vector (1 x cols)
|
|
double tau_v[], // vector (1 x cols - 1)
|
|
int rows, int cols);
|
|
|
|
void qrstep_middle(
|
|
double u[][3], // matrix (rows x cols)
|
|
double tau_u[], // vector (1 x cols)
|
|
double tau_v[], // vector (1 x cols - 1)
|
|
int rows, int cols, int col);
|
|
|
|
void qrstep_end(
|
|
double v[][3], // matrix (3 x 3)
|
|
double tau_u[], // vector (1 x 3)
|
|
double tau_v[], // vector (1 x 2)
|
|
int cols);
|
|
|
|
double qrstep_eigenvalue(
|
|
double tau_u[], // vector (1 x 3)
|
|
double tau_v[], // vector (1 x 2)
|
|
int cols);
|
|
|
|
void qrstep_cols2(
|
|
double u[][3], // matrix (rows x 2)
|
|
double v[][3], // matrix (3 x 2)
|
|
double tau_u[], // vector (1 x 2)
|
|
double tau_v[], // vector (1 x 1)
|
|
int rows);
|
|
|
|
void computeGivens(
|
|
double a, double b, double *c, double *s);
|
|
|
|
void computeSchur(
|
|
double a1, double a2, double a3,
|
|
double *c, double *s);
|
|
|
|
// singularize
|
|
|
|
void singularize(
|
|
double u[][3], // matrix (rows x 3)
|
|
double v[3][3], // matrix (3x3)
|
|
double d[3], // vector, (1x3)
|
|
int rows);
|
|
|
|
// solve svd
|
|
void solveSVD(
|
|
double u[][3], // matrix (rows x 3)
|
|
double v[3][3], // matrix (3x3)
|
|
double d[3], // vector (1x3)
|
|
double b[], // vector (1 x rows)
|
|
double x[3], // vector (1x3)
|
|
int rows);
|
|
|
|
|
|
} // namespace ThreeD
|
|
|
|
#include "PolyVoxCore/Impl/QEF.inl"
|
|
|
|
#endif // _THREED_QEF_H
|