📄 dxvector.h
字号:
for( i = 0;i < 4; i++ )
{
Pivot = 0;
for( j = 0; j < 4; j++ )
{
if( fabs(m_Coeff[i][j]) > fabs(m_Coeff[i][Pivot]) ) Pivot = j;
}
if( m_Coeff[i][Pivot] == 0.0 )
{
ZeroMatrix(); /* Singular Matrix */
return FALSE;
}
/* Normalize */
PValue = m_Coeff[i][Pivot];
for( j = 0; j < 4; j++ )
{
m_Coeff[i][j] /= PValue;
Mx.m_Coeff[i][j] /= PValue;
}
/* Zeroing */
for( j = 0; j < 4; j++ )
{
if( j != i )
{
PValue = m_Coeff[j][Pivot];
for( k = 0; k < 4; k++ )
{
m_Coeff[j][k] -= PValue*m_Coeff[i][k];
Mx.m_Coeff[j][k] -= PValue*Mx.m_Coeff[i][k];
}
}
}
}
/* Reorder rows */
for( i = 0; i < 4; i++ )
{
if( m_Coeff[i][i] != 1.0 )
{
for( j = i + 1; j < 4; j++ )
if( m_Coeff[j][i] == 1.0 ) break;
if( j >= 4 )
{
ZeroMatrix();
return FALSE;
}
//--- swap rows i and j of original
for( k = 0; k < 4; k++ )
{
m_Coeff[i][k] += m_Coeff[j][k];
m_Coeff[j][k] = m_Coeff[i][k] - m_Coeff[j][k];
m_Coeff[i][k] -= m_Coeff[j][k];
}
//--- swap rows i and j of result
for( k = 0; k < 4; k++ )
{
Mx.m_Coeff[i][k] += Mx.m_Coeff[j][k];
Mx.m_Coeff[j][k] = Mx.m_Coeff[i][k] - Mx.m_Coeff[j][k];
Mx.m_Coeff[i][k] -= Mx.m_Coeff[j][k];
}
}
}
*this = Mx;
return TRUE;
} /* CDXMatrix4x4F::Invert */
inline void CDXMatrix4x4F::Transpose()
{
float temp;
temp = m_Coeff[0][1];
m_Coeff[0][1] = m_Coeff[1][0];
m_Coeff[1][0] = temp;
temp = m_Coeff[0][2];
m_Coeff[0][2] = m_Coeff[2][0];
m_Coeff[2][0] = temp;
temp = m_Coeff[0][3];
m_Coeff[0][3] = m_Coeff[3][0];
m_Coeff[3][0] = temp;
temp = m_Coeff[1][2];
m_Coeff[1][2] = m_Coeff[2][1];
m_Coeff[2][1] = temp;
temp = m_Coeff[1][3];
m_Coeff[1][3] = m_Coeff[3][1];
m_Coeff[3][1] = temp;
temp = m_Coeff[2][3];
m_Coeff[2][3] = m_Coeff[3][2];
m_Coeff[3][2] = temp;
} /* CDXMatrix4x4F::Transpose */
inline void CDXMatrix4x4F::GetTranspose( CDXMatrix4x4F *m )
{
float temp;
(*this) = *m;
temp = m_Coeff[0][1];
m_Coeff[0][1] = m_Coeff[1][0];
m_Coeff[1][0] = temp;
temp = m_Coeff[0][2];
m_Coeff[0][2] = m_Coeff[2][0];
m_Coeff[2][0] = temp;
temp = m_Coeff[0][3];
m_Coeff[0][3] = m_Coeff[3][0];
m_Coeff[3][0] = temp;
temp = m_Coeff[1][2];
m_Coeff[1][2] = m_Coeff[2][1];
m_Coeff[2][1] = temp;
temp = m_Coeff[1][3];
m_Coeff[1][3] = m_Coeff[3][1];
m_Coeff[3][1] = temp;
temp = m_Coeff[2][3];
m_Coeff[2][3] = m_Coeff[3][2];
m_Coeff[3][2] = temp;
} /* CDXMatrix4x4F::Transpose */
/*
Matrix Inversion
by Richard Carling
from "Graphics Gems", Academic Press, 1990
*/
#define SMALL_NUMBER 1.e-8
/*
* inverse( original_matrix, inverse_matrix )
*
* calculate the inverse of a 4x4 matrix
*
* -1
* A = ___1__ adjoint A
* det A
*/
inline BOOL CDXMatrix4x4F::GetInverse( CDXMatrix4x4F *pIn )
{
int i, j;
float det;
/* calculate the adjoint matrix */
GetAdjoint( pIn );
/* calculate the 4x4 determinant
* if the determinant is zero,
* then the inverse matrix is not unique.
*/
det = det4x4( pIn );
if( fabs( det ) < SMALL_NUMBER )
{
// Non-singular matrix, no inverse!
return FALSE;;
}
/* scale the adjoint matrix to get the inverse */
for( i = 0; i < 4; i++ )
for( j = 0; j < 4; j++ )
m_Coeff[i][j] = m_Coeff[i][j] / det;
return TRUE;
}
/*
* adjoint( original_matrix, inverse_matrix )
*
* calculate the adjoint of a 4x4 matrix
*
* Let a denote the minor determinant of matrix A obtained by
* ij
*
* deleting the ith row and jth column from A.
*
* i+j
* Let b = (-1) a
* ij ji
*
* The matrix B = (b ) is the adjoint of A
* ij
*/
inline void CDXMatrix4x4F::GetAdjoint( CDXMatrix4x4F *pIn )
{
float a1, a2, a3, a4, b1, b2, b3, b4;
float c1, c2, c3, c4, d1, d2, d3, d4;
/* assign to individual variable names to aid */
/* selecting correct values */
a1 = pIn->m_Coeff[0][0]; b1 = pIn->m_Coeff[0][1];
c1 = pIn->m_Coeff[0][2]; d1 = pIn->m_Coeff[0][3];
a2 = pIn->m_Coeff[1][0]; b2 = pIn->m_Coeff[1][1];
c2 = pIn->m_Coeff[1][2]; d2 = pIn->m_Coeff[1][3];
a3 = pIn->m_Coeff[2][0]; b3 = pIn->m_Coeff[2][1];
c3 = pIn->m_Coeff[2][2]; d3 = pIn->m_Coeff[2][3];
a4 = pIn->m_Coeff[3][0]; b4 = pIn->m_Coeff[3][1];
c4 = pIn->m_Coeff[3][2]; d4 = pIn->m_Coeff[3][3];
/* row column labeling reversed since we transpose rows & columns */
m_Coeff[0][0] = det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4);
m_Coeff[1][0] = - det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4);
m_Coeff[2][0] = det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4);
m_Coeff[3][0] = - det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
m_Coeff[0][1] = - det3x3( b1, b3, b4, c1, c3, c4, d1, d3, d4);
m_Coeff[1][1] = det3x3( a1, a3, a4, c1, c3, c4, d1, d3, d4);
m_Coeff[2][1] = - det3x3( a1, a3, a4, b1, b3, b4, d1, d3, d4);
m_Coeff[3][1] = det3x3( a1, a3, a4, b1, b3, b4, c1, c3, c4);
m_Coeff[0][2] = det3x3( b1, b2, b4, c1, c2, c4, d1, d2, d4);
m_Coeff[1][2] = - det3x3( a1, a2, a4, c1, c2, c4, d1, d2, d4);
m_Coeff[2][2] = det3x3( a1, a2, a4, b1, b2, b4, d1, d2, d4);
m_Coeff[3][2] = - det3x3( a1, a2, a4, b1, b2, b4, c1, c2, c4);
m_Coeff[0][3] = - det3x3( b1, b2, b3, c1, c2, c3, d1, d2, d3);
m_Coeff[1][3] = det3x3( a1, a2, a3, c1, c2, c3, d1, d2, d3);
m_Coeff[2][3] = - det3x3( a1, a2, a3, b1, b2, b3, d1, d2, d3);
m_Coeff[3][3] = det3x3( a1, a2, a3, b1, b2, b3, c1, c2, c3);
}
/*
* float = det4x4( matrix )
*
* calculate the determinant of a 4x4 matrix.
*/
inline float det4x4( CDXMatrix4x4F *pIn )
{
float ans;
float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
/* assign to individual variable names to aid selecting */
/* correct elements */
a1 = pIn->m_Coeff[0][0]; b1 = pIn->m_Coeff[0][1];
c1 = pIn->m_Coeff[0][2]; d1 = pIn->m_Coeff[0][3];
a2 = pIn->m_Coeff[1][0]; b2 = pIn->m_Coeff[1][1];
c2 = pIn->m_Coeff[1][2]; d2 = pIn->m_Coeff[1][3];
a3 = pIn->m_Coeff[2][0]; b3 = pIn->m_Coeff[2][1];
c3 = pIn->m_Coeff[2][2]; d3 = pIn->m_Coeff[2][3];
a4 = pIn->m_Coeff[3][0]; b4 = pIn->m_Coeff[3][1];
c4 = pIn->m_Coeff[3][2]; d4 = pIn->m_Coeff[3][3];
ans = a1 * det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4 )
- b1 * det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4 )
+ c1 * det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4 )
- d1 * det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4 );
return ans;
}
/*
* float = det3x3( a1, a2, a3, b1, b2, b3, c1, c2, c3 )
*
* calculate the determinant of a 3x3 matrix
* in the form
*
* | a1, b1, c1 |
* | a2, b2, c2 |
* | a3, b3, c3 |
*/
inline float det3x3( float a1, float a2, float a3,
float b1, float b2, float b3,
float c1, float c2, float c3 )
{
float ans;
ans = a1 * det2x2( b2, b3, c2, c3 )
- b1 * det2x2( a2, a3, c2, c3 )
+ c1 * det2x2( a2, a3, b2, b3 );
return ans;
}
/*
* float = det2x2( float a, float b, float c, float d )
*
* calculate the determinant of a 2x2 matrix.
*/
inline float det2x2( float a, float b, float c, float d )
{
float ans = a * d - b * c;
return ans;
}
inline HRESULT CDXMatrix4x4F::InitFromSafeArray( SAFEARRAY * /*pSA*/ )
{
HRESULT hr = S_OK;
#if 0
long *pData;
if( !pSA || ( pSA->cDims != 1 ) ||
( pSA->cbElements != sizeof(float) ) ||
( pSA->rgsabound->lLbound != 1 ) ||
( pSA->rgsabound->cElements != 8 )
)
{
hr = E_INVALIDARG;
}
else
{
hr = SafeArrayAccessData(pSA, (void **)&pData);
if( SUCCEEDED( hr ) )
{
for( int i = 0; i < 4; ++i )
{
m_Bounds[i].Min = pData[i];
m_Bounds[i].Max = pData[i+4];
m_Bounds[i].SampleRate = SampleRate;
}
hr = SafeArrayUnaccessData( pSA );
}
}
#endif
return hr;
} /* CDXMatrix4x4F::InitFromSafeArray */
inline HRESULT CDXMatrix4x4F::GetSafeArray( SAFEARRAY ** /*ppSA*/ ) const
{
HRESULT hr = S_OK;
#if 0
SAFEARRAY *pSA;
if( !ppSA )
{
hr = E_POINTER;
}
else
{
SAFEARRAYBOUND rgsabound;
rgsabound.lLbound = 1;
rgsabound.cElements = 16;
if( !(pSA = SafeArrayCreate( VT_I4, 1, &rgsabound ) ) )
{
hr = E_OUTOFMEMORY;
}
else
{
long *pData;
hr = SafeArrayAccessData( pSA, (void **)&pData );
if( SUCCEEDED( hr ) )
{
for( int i = 0; i < 4; ++i )
{
pData[i] = m_Bounds[i].Min;
pData[i+4] = m_Bounds[i].Max;
}
hr = SafeArrayUnaccessData( pSA );
}
}
if( SUCCEEDED( hr ) )
{
*ppSA = pSA;
}
}
#endif
return hr;
} /* CDXMatrix4x4F::GetSafeArray */
inline void CDXMatrix4x4F::TransformBounds( DXBNDS& /*Bnds*/, DXBNDS& /*ResultBnds*/ )
{
} /* CDXMatrix4x4F::TransformBounds */
#pragma option pop /*P_O_Pop*/
#endif // DXVector_h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -