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;

}


程序结果:



posted on 2014-03-05 01:15  爱你一万年123  阅读(171)  评论(0编辑  收藏  举报

导航