Error en XNA Developer function CalculateEigenVector () del file "xnacollision.cpp"?

Estoy tratando de descifrar el contenido del file fuente de Microsoft XNA Developer "xnacollision.cpp" y he encontrado una function que calcula uno de los tres vectores propios de un sistema homogéneo de tres ecuaciones lineales. El nombre de esa function es CalculateEigenVector () y su contenido es el siguiente:

//----------------------------------------------------------------------------- static inline XMVECTOR CalculateEigenVector( FLOAT m11, FLOAT m12, FLOAT m13, FLOAT m22, FLOAT m23, FLOAT m33, FLOAT e ) { FLOAT f1, f2, f3; FLOAT fTmp[3]; fTmp[0] = ( FLOAT )( m12 * m23 - m13 * ( m22 - e ) ); fTmp[1] = ( FLOAT )( m13 * m12 - m23 * ( m11 - e ) ); fTmp[2] = ( FLOAT )( ( m11 - e ) * ( m22 - e ) - m12 * m12 ); XMVECTOR vTmp = XMLoadFloat3( (XMFLOAT3*)fTmp ); if( XMVector3Equal( vTmp, XMVectorZero() ) ) // planar or linear { // we only have one equation - find a valid one if( ( m11 - e != 0.0 ) || ( m12 != 0.0 ) || ( m13 != 0.0 ) ) { f1 = m11 - e; f2 = m12; f3 = m13; } else if( ( m12 != 0.0 ) || ( m22 - e != 0.0 ) || ( m23 != 0.0 ) ) { f1 = m12; f2 = m22 - e; f3 = m23; } else if( ( m13 != 0.0 ) || ( m23 != 0.0 ) || ( m33 - e != 0.0 ) ) { f1 = m13; f2 = m23; f3 = m33 - e; } else { // error, we'll just make something up - we have NO context f1 = 1.0; f2 = 0.0; f3 = 0.0; } if( f1 == 0.0 ) vTmp = XMVectorSetX( vTmp, 0.0f ); else vTmp = XMVectorSetX( vTmp, 1.0f ); if( f2 == 0.0 ) vTmp = XMVectorSetY( vTmp, 0.0f ); else vTmp = XMVectorSetY( vTmp, 1.0f ); if( f3 == 0.0 ) { vTmp = XMVectorSetZ( vTmp, 0.0f ); // recalculate y to make equation work if( m12 != 0.0 ) vTmp = XMVectorSetY( vTmp, ( FLOAT )( -f1 / f2 ) ); } else { vTmp = XMVectorSetZ( vTmp, ( FLOAT )( ( f2 - f1 ) / f3 ) ); } } if( XMVectorGetX( XMVector3LengthSq( vTmp ) ) > 1e-5f ) { return XMVector3Normalize( vTmp ); } else { // Multiply by a value large enough to make the vector non-zero. vTmp *= 1e5f; return XMVector3Normalize( vTmp ); } } 

En mi opinión, hay dos errores:

1) El fragment de código:

 // recalculate y to make equation work if( m12 != 0.0 ) vTmp = XMVectorSetY( vTmp, ( FLOAT )( -f1 / f2 ) ); 

debe cambiarse con:

 if( f1 != 0.0f ) vTmp = XMVectorSetX( vTmp, ( FLOAT )( -f2 / f1 ) ); if( f2 != 0.0f ) vTmp = XMVectorSetY( vTmp, ( FLOAT )( -f1 / f2 ) ); 

2) En el siguiente bloque else en su lugar:

 vTmp = XMVectorSetZ( vTmp, ( FLOAT )( ( f2 - f1 ) / f3 ) ); 

Debemos tener:

 vTmp = XMVectorSetZ( vTmp, ( FLOAT )( ( -f2 - f1 ) / f3 ) ); 

Por favor dime si estoy equivocado o no!

Tu punto ① es casi correcto. Esto es de hecho un error, pero tu solución también tiene errores. Cuando f1 != 0 y f2 == 0 vas a establecer X = 0 y tu autovector será cero. Aquí está la solución correcta, mucho más simple:

 // recalculate y to make equation work if( f2 != 0.0 ) vTmp = XMVectorSetY( vTmp, ( FLOAT )( -f1 / f2 ) ); 

Tu punto ② es correcto. Este es un error y tu solución da el valor adecuado para Z