Fix power method initial estimate as in squish.

This commit is contained in:
castano 2010-05-31 07:40:08 +00:00
parent 8e074b2e28
commit 9ae9ec1975
2 changed files with 25 additions and 7 deletions

View File

@ -1,4 +1,4 @@
// This code is in the public domain -- icastano@gmail.com // This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
#include "Fitting.h" #include "Fitting.h"
#include "nvcore/Utils.h" // max, swap #include "nvcore/Utils.h" // max, swap
@ -8,6 +8,24 @@
using namespace nv; using namespace nv;
// @@ Move to EigenSolver.h // @@ Move to EigenSolver.h
// @@ We should be able to do something cheaper...
static Vector3 estimatePrincipleComponent(const float * __restrict matrix)
{
const Vector3 row0(matrix[0], matrix[1], matrix[2]);
const Vector3 row1(matrix[1], matrix[3], matrix[4]);
const Vector3 row2(matrix[2], matrix[4], matrix[5]);
float r0 = lengthSquared(row0);
float r1 = lengthSquared(row1);
float r2 = lengthSquared(row2);
if (r0 > r1 && r0 > r2) return row0;
if (r1 > r2) return row1;
return row2;
}
static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matrix) static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matrix)
{ {
if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
@ -15,9 +33,9 @@ static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matri
return Vector3(zero); return Vector3(zero);
} }
const int NUM = 8; Vector3 v = estimatePrincipleComponent(matrix);
Vector3 v(1, 1, 1); const int NUM = 8;
for (int i = 0; i < NUM; i++) for (int i = 0; i < NUM; i++)
{ {
float x = v.x * matrix[0] + v.y * matrix[1] + v.z * matrix[2]; float x = v.x * matrix[0] + v.y * matrix[1] + v.z * matrix[2];

View File

@ -1,12 +1,12 @@
// This code is in the public domain -- icastano@gmail.com // This code is in the public domain -- Ignacio Castaño <castano@gmail.com>
#pragma once #pragma once
#ifndef NV_MATH_FITTING_H #ifndef NV_MATH_FITTING_H
#define NV_MATH_FITTING_H #define NV_MATH_FITTING_H
#include <nvmath/nvmath.h> #include "nvmath/nvmath.h"
#include <nvmath/Vector.h> #include "nvmath/Vector.h"
#include <nvmath/Plane.h> #include "nvmath/Plane.h"
namespace nv namespace nv
{ {