• DirectX10一矩阵代数(二)


    一.矩阵基本概念

    DirectX10中,矩阵是一个非常重要的概念,这里我们主要探讨以下几个方面:

    1.矩阵乘法

             假设A是一个m*n矩阵,B是一个n*p的矩阵,若C = A* B,则C是一个m*p矩阵,其中C的每一个元素Ci,j = Ai,* * B*,j

    2.向量-矩阵乘法

              假设向量u=(x,y,z),矩阵A = [A*,1,A*,2,A*,3],则向量u与矩阵A相乘的结果为uA = xA*,1 + yA*,2 + zA*,3,这说明向量-矩阵的乘积uA等于向量的标量系数与矩阵A的行向量的线性组合。

    注意:矩阵乘法满足交换律,即A(BC) = ABC

    3.矩阵转置

              对一个矩阵M的行列进行互换,即可得到该矩阵的转置(transpose)矩阵,记作MT.

    4.单位矩阵

             单位矩阵(identitymatrix)是一个正方形矩阵,其除了对角线上的元素为1外,其余都为0.

    注意:单位矩阵的作用相当于一个乘法单位,也就是,如果A是一个m*n矩阵,B是一个n*p矩阵,In*n单位矩阵,那么,AI=AIB = B

    5.逆矩阵

    矩阵运算中没有除法运算,但是却定义了一种逆(inverse)运算.

    注意:

    1.只有正方形矩阵有逆运算

    2.逆矩阵记作M-1

    3.并不是所有的正方形矩阵都有逆矩阵,有逆矩阵的正方形矩阵称为可逆矩阵,没有逆矩阵的正方形矩阵称为单调矩阵

    4.逆矩阵若存在,必定唯一

    5.矩阵与其逆矩阵相乘必为单位矩阵

    6.(AB)-1  =  B-1 * A-1

    二.D3DX中的矩阵

    1.基本类与函数

    D3DX中,我们主要使用D3DXMATRIX类表示4*4矩阵,其在D3DX中的定义如下:

    typedef struct D3DXMATRIX: public D3DMATRIX
    
    {
    
    public D3DXMATRIX(){};
    
    public D3DXMATRIX(CONST  FLOAT*);
    
    public D3DXMATRIX(CONST D3DMATRIX&);
    
    public D3DXMATRIX(CONST D3DXFLOAT16 *);
    
    public D3DXMATRIX(
    
    FLOAT _11,FLOAT _12,FLOAT _13,FLOAT _14,
    
    FLOAT _21,FLOAT _22,FLOAT _23,FLOAT _24,
    
    FLOAT _31,FLOAT _32,FLOAT _33,FLOAT _34,
    
    FLOAT _41,FLOAT _42,FLOAT _43,FLOAT _44,
    
    );
    
    FLOAT & operator(UINT row,UINT col) ;
    
    FLOAT operator(UINT row,UINT col) const;
    
     
    
    operator FLOAT*();
    
    operator  CONST FLOAT*() const; 
    
     
    
    D3DXMATRIX& operator *= (CONST D3DXMATRIX&);
    
    D3DXMATRIX& operator += (CONST D3DXMATRIX&);
    
    D3DXMATRIX& operator -= (CONST D3DXMATRIX&);
    
    D3DXMATRIX& operator *= (FLOAT);
    
    D3DXMATRIX& operator /=(FLOAT);
    
     
    
     
    
    D3DXMATRIX operator + () const;
    
    D3DXMATRIX operator - () const;
    
     
    
    D3DXMATRIX operator *(CONST D3DXMATRIX&) const;
    
    D3DXMATRIX operator +(CONST D3DXMATRIX&) const;
    
    D3DXMATRIX operator -(CONST D3DXMATRIX&) const;
    
    D3DXMATRIX operator * (FLOAT) const;
    
    D3DXMATRIX operator / (FLOAT) const;
    
     
    
    friend  D3DXMATRIX operator *(FLOAT,CONST D3DXMATRIX &);
    
    bool operator ==(CONST D3DXMATRIX&) CONST;
    
    bool operator !=(CONST D3DXMATRIX&) CONST;
    
    }D3DXMATRIX,*LPD3DXMATRIX;


              除了上述定义之外,D3DX库还定义了许多实用函数,分别用于获取4 x 4单位矩阵,计算转置矩阵,计算逆矩阵,以及几种不同维数的向量矩阵乘法。

    分别如下:

    D3DXMATRIX  *D3DXMatrixIdentity(
    
    D3DXMATRIX *pOut;// 获取单位矩阵
    
    );
    
    D3DXMATRIX *D3DXMatrixTranspose(
    
    D3DXMATRIX *pOut;//输出 MT
    
    CONST D3DXMATRIX *pM;//输入M,
    
    );
    
    D3DXMATRIX *D3DXMatrixInverse(
    
    D3DXMATRIX *pOut;//输出M-1
    
    FLOAT * pDeterminent;//通常为0
    
    CONST D3DXMATRIX *pM;//输入M
    
    );
    
    D3DXVECTOR4 *D3DXVec4Transform(
    
    D3DXVECTOR4 *pOut;//输出 V*M
    
    CONST D3DXVECTOR4 *pV;//输入 V
    
    CONST D3DXMATRIX *pM;// 输入 M
    
    );


    2.程序演示

    注意:程序中的一些配置不再赘述,可参考

    #include<D3D10.h>
    
    #include<iostream>
    
    #include<D3DX10math.h>
    
    using namespace  std;
    
     
    
    ostream& operator<<(ostream& os,D3DXVECTOR4& v)
    
    {
    
    os<<"{"<<v.x<<","<<v.y<<","<<v.z<<","<<v.w<<"}";
    
    return os;
    
    }
    
     
    
    ostream& operator<<(ostream& os,D3DXMATRIX& m)
    
    {
    
    for (int i=0;i<4;++i)
    
    {
    
    for (int j=0;j<4;++j)
    
    {
    
    os<<m(i,j)<<" ";
    
    }
    
    os<<endl;
    
    }
    
    return os;
    
    }
    
     
    
     
    
    int main()
    
    {
    
     
    
    D3DXMATRIX A(
    
    1.0f,0,0,0,
    
    0,2.0f,0,0,
    
    0,0,4.0f,0,
    
    1.0f,2.0f,3.0f,1.0f
    
    );
    
    D3DXMATRIX B;
    
     
    
    D3DXMatrixIdentity(&B);//求ó单蹋?位?矩?阵ó
    
     
    
    D3DXMATRIX C = A*B;//矩?阵ó乘?法ぁ?
    
     
    
    D3DXMATRIX D,E,F;
    
     
    
    D3DXMatrixTranspose(&D,&A);//矩?阵ó转羇置?
    
     
    
    D3DXMatrixInverse(&E,0,&A);//逆?矩?阵ó
    
     
    
    F = A * E;//向ò量?*矩?阵ó
    
     
    
    D3DXVECTOR4 P(2.0f,2.0f,2.0f,1.0f);
    
    D3DXVECTOR4 Q(2.0f,2.0f,2.0f,0.0f);
    
    D3DXVECTOR4 R,S;
    
     
    
    D3DXVec4Transform(&R,&P,&A);//R = P * A
    
    D3DXVec4Transform(&S,&Q,&A);//S = Q * A
    
     
    
    //////////////////////////////////////////////////////////////////////////
    
     
    
    cout<<"A = "<<endl<<A<<endl;
    
    cout<<"B = "<<endl<<B<<endl;
    
    cout<<"C =  A*B = "<<endl<<C<<endl;
    
    cout<<"D =  transpose(A) = "<<endl<<D<<endl;
    
    cout<<"E =  inverse(A) = "<<endl<<E<<endl;
    
    cout<<"F =  A*E = "<<endl<<F<<endl;
    
    cout<<"P = "<<P<<endl;
    
    cout<<"Q = "<<Q<<endl;
    
    cout<<"R = P*A = "<<R<<endl;
    
    cout<<"S = Q*A = "<<S<<endl;
    
     
    
    system("pause");
    
    return 0;
    
    }


    程序结果:



  • 相关阅读:
    Confluence 6 在升级过程中查看合并日志
    Confluence 6 从 WIKI 标记整合到基于 XHTML 的存储格式
    Confluence 6 升级完成后的检查
    Confluence 6 超过当前许可证期限进行升级
    HDU2571--命运---DP
    HDU 2084 DP经典例子---数塔问题
    紫书第二章
    求组合数
    欧拉函数
    二分幂/快速幂
  • 原文地址:https://www.cnblogs.com/ainima/p/6331131.html
Copyright © 2020-2023  润新知