首页 > 代码库 > ActionScript3游戏中的图像编程(连载七十八)

ActionScript3游戏中的图像编程(连载七十八)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477

4.3.5 DynamicMatrix中的矩阵数学

      在进入AdjustColor类之前,我们先来了解里面用到的一个关键类——DynamicMatrix,它同样位于fl.motion包中,您除了可以从Adobe的帮助文件中找到该类的使用说明,还能查看它的源代码了解其实现过程。


      与Matrix不同,DynamicMatrix支持任意行数和任意列数的矩阵。当您执行以下代码:

 

var mt:DynamicMatrix = new DynamicMatrix(5, 4);



      程序就会为您创建一个5行4列的矩阵。


      我们可以用GetValue和SetValue方法获取和设置某个元素的值。


      AdjustColor类包含了色相,亮度,对比度和饱和度4个属性,每个属性都带有属于自己的变换矩阵,想要同时应用到同一个ColorMatrixFilter中,矩阵的运算便必不可少了。

 

      所以,在这个类里面,您可以找到矩阵的很多数学运算:


      public function LoadIdentity():void

      用单位矩阵的数据进行填充,主对角线元素均设置为1,其它元素都等于0。


      public function LoadZeros():void

      用零矩阵的数据进行填充,所有元素都等于0。

 

      矩阵的加法运算:public function Add(inMatrix:DynamicMatrix):Boolean

 

      矩阵的数乘运算:public function MultiplyNumber(value:Number):Boolean

 

      矩阵的乘法运算:public function Multiply(inMatrix:DynamicMatrix, order:int = MATRIX_ORDER_PREPEND):Boolean

 

      加法,数乘,乘法等计算我已经给出了很详细的讲解,结合4.1节的内容将不难理解它们的实现过程。其中需要注意的一点是乘法的order参数,order等于MATRIX_ORDER_PREPEND时,执行this×inMatrix,order等于MATRIX_ORDER_APPEND,执行inMatrix×this,两者不等价,因为矩阵乘法不满足交换律。

 

      让笔者感到比较遗憾的一点是,DynamicMatrix并没有给出逆矩阵的算法。不过当笔者查阅了线性代数的教材之后就觉得不在ActionScript中提供逆矩阵的实现是情有可原的。随着矩阵行数和列数的增大,逆矩阵的运算过程越来越复杂,它涉及到行列式,多元一次方程,高斯消元,矩阵置换等高等数学知识,不依赖于数学编程语言(如MatLab,Mathemetica等)将很难完成。而ActionScript本身又不是专攻数学的程序,如果真要让ActionScript在这个地方深挖的话,就未免有点舍本逐末了。

 

      以上运算仍然过于通用,真正应用在色彩变换里面并不方便,因此Adobe在DynamicMatrix的基础上扩展了一个子类ColorMatrix,里面封装了色彩矩阵的运算以供AdjustColor直接调用。

 

 


 

ActionScript3游戏中的图像编程(连载七十八)