首页 > 代码库 > 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游戏中的图像编程(连载七十八)