暂时绕过浮点数等优化,直接看如何求解A*X=B,只需提供的是系数矩阵A和常量矩阵B,
先求A的行列式
float ddraw_math::Mat_Det_2X2(MATRIX2X2_PTR m)
{
return ( m->M00 * m->M11 - m->M01 * m->M10 );
}
将A复制到工作矩阵中
void ddraw_math::MAT_COPY_2X2( MATRIX2X2_PTR src_mat, MATRIX2X2_PTR dest_mat )
{
memcpy( ( void * ) ( dest_mat ), ( void * ) ( src_mat ), sizeof( MATRIX2X2 ) );
}
求解
int ddraw_math::Solve_2X2_System(MATRIX2X2_PTR A, MATRIX1X2_PTR X, MATRIX1X2_PTR B)
{
float det_A = Mat_Det_2X2( A );
if( fabs( det_A ) < EPSILON_E5 )
return ( 0 );
MATRIX2X2 work_mat;
MAT_COPY_2X2( A, & work_mat );
MAT_COLUMN_SWAP_2X2( & work_mat, 0, B );
float det_ABx = Mat_Det_2X2( & work_mat );
X->M00 = det_ABx / det_A;
MAT_COPY_2X2( A, & work_mat );
MAT_COLUMN_SWAP_2X2( & work_mat, 1, B );
float det_ABy = Mat_Det_2X2( & work_mat );
X->M01 = det_ABy / det_A;
return ( 1 );
}
同样,对于3X3来说,float ddraw_math::Mat_Det_3X3(MATRIX3X3_PTR m)
{
return ( m->M00 * ( m->M11 * m->M22 - m->M21 * m->M12 ) -
m->M01 * ( m->M10 * m->M22 - m->M20 * m->M12 ) +
m->M02 * ( m->M10 * m->M21 - m->M20 * m->M11 ) );
}
到此,这几个DEMO就结束了,数学引擎这边再看下有什么需要补充的。