Port fix from 2.0 to trunk. Problem discovered thanks to Jern-Kuan.
This commit is contained in:
parent
0eb7c3eb71
commit
897cc78397
|
@ -194,14 +194,26 @@ inline __device__ __host__ float lengthSquared(float3 a)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Use power method to find the first eigenvector.
|
// Use power method to find the first eigenvector.
|
||||||
// http://www.miislita.com/information-retrieval-tutorial/matrix-tutorial-3-eigenvalues-eigenvectors.html
|
// http://www.miislita.com/information-retrieval-tutorial/matrix-tutorial-3-eigenvalues-eigenvectors.html
|
||||||
inline __device__ __host__ float3 firstEigenVector( float matrix[6] )
|
inline __device__ __host__ float3 firstEigenVector( float matrix[6] )
|
||||||
{
|
{
|
||||||
// 8 iterations seems to be more than enough.
|
// 8 iterations seems to be more than enough.
|
||||||
|
|
||||||
float3 v = make_float3(1.0f, 1.0f, 1.0f);
|
float3 row0 = make_float3(matrix[0], matrix[1], matrix[2]);
|
||||||
|
float3 row1 = make_float3(matrix[1], matrix[3], matrix[4]);
|
||||||
|
float3 row2 = make_float3(matrix[2], matrix[4], matrix[5]);
|
||||||
|
|
||||||
|
float r0 = dot(row0, row0);
|
||||||
|
float r1 = dot(row1, row1);
|
||||||
|
float r2 = dot(row2, row2);
|
||||||
|
|
||||||
|
float3 v;
|
||||||
|
if (r0 > r1 && r0 > r2) v = row0;
|
||||||
|
else if (r1 > r2) v = row1;
|
||||||
|
else v = row2;
|
||||||
|
|
||||||
|
//float3 v = make_float3(1.0f, 1.0f, 1.0f);
|
||||||
for(int i = 0; i < 8; i++) {
|
for(int i = 0; i < 8; 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];
|
||||||
float y = v.x * matrix[1] + v.y * matrix[3] + v.z * matrix[4];
|
float y = v.x * matrix[1] + v.y * matrix[3] + v.z * matrix[4];
|
||||||
|
@ -215,6 +227,7 @@ inline __device__ __host__ float3 firstEigenVector( float matrix[6] )
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline __device__ bool singleColor(const float3 * colors)
|
inline __device__ bool singleColor(const float3 * colors)
|
||||||
{
|
{
|
||||||
#if __DEVICE_EMULATION__
|
#if __DEVICE_EMULATION__
|
||||||
|
@ -316,12 +329,23 @@ inline __device__ float3 bestFitLine(const float3 * colors, float3 color_sum, fl
|
||||||
return firstEigenVector(covariance);
|
return firstEigenVector(covariance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @@ For 2D this may not be the most efficient method. It's a quadratic equation, right?
|
// @@ For 2D this may not be the most efficient method. It's a quadratic equation, right?
|
||||||
inline __device__ __host__ float2 firstEigenVector2D( float matrix[3] )
|
inline __device__ __host__ float2 firstEigenVector2D( float matrix[3] )
|
||||||
{
|
{
|
||||||
// @@ 8 iterations is probably more than enough.
|
// @@ 8 iterations is probably more than enough.
|
||||||
|
|
||||||
float2 v = make_float2(1.0f, 1.0f);
|
const float3 row0 = make_float2(matrix[0], matrix[1]);
|
||||||
|
const float3 row1 = make_float2(matrix[1], matrix[2]);
|
||||||
|
|
||||||
|
float r0 = lengthSquared(row0);
|
||||||
|
float r1 = lengthSquared(row1);
|
||||||
|
|
||||||
|
float2 v;
|
||||||
|
if (r0 > r1) v = row0;
|
||||||
|
v = row1;
|
||||||
|
|
||||||
|
//float2 v = make_float2(1.0f, 1.0f);
|
||||||
for(int i = 0; i < 8; i++) {
|
for(int i = 0; i < 8; i++) {
|
||||||
float x = v.x * matrix[0] + v.y * matrix[1];
|
float x = v.x * matrix[0] + v.y * matrix[1];
|
||||||
float y = v.x * matrix[1] + v.y * matrix[2];
|
float y = v.x * matrix[1] + v.y * matrix[2];
|
||||||
|
|
Loading…
Reference in New Issue
Block a user