2013年12月5日星期四(数学)

时间:2022-01-04 14:29:45

暂时绕过浮点数等优化,直接看如何求解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就结束了,数学引擎这边再看下有什么需要补充的。