AS3 Matrix的一些总结

一直觉得ActionScript 3.0还有很多不知名的语法常在某个角落里,这些又偏偏是晋升“强力”的垫脚石。(因为没什么其他人知道,其他那些烂大街的功能几乎每一本书都有写,也就不值钱了)

今天介绍一下关于矩阵Matrix的一些基础知识吧···想到哪写到哪···也没什么组织···呵呵···就算给自己巩固一下了。

先说一下自己的理解,Matrix是flash.geom包里的,主要是做一些数学运算的基础,编程在后期都会跟数学有牵扯不清,密不可分的关系。矩阵在大学的时候学“线性代数”的时候学过,那时还蛮认真的,但是4年过去了,几乎忘了90%···XXOO···闲话少说,还是看看AS3的Matrix是怎样的。

首先好好的来翻阅《帮助文档》,做一做读书笔记。

一,矩阵直接继承Object属性,就是不会有什么特殊的父类的属性或者方法。

二,矩阵又叫转换矩阵,主要用在显示对象的transform属性,哦?显示对象有这个属性?让我们来查查常见的显示对象:MovieClip,Sprite,Bitmap...没找到...

开玩笑的,我查看了继承的公共属性,原来transform是在DisplayObject上(汗,之前不是说了显示对象吗)。那么MC,Sprite,Bitmap这些继承了DisplayObject的也一并有了对应的属性。

2-1,如何应用Matrix转换矩阵?帮助文档上说有两种方法:

A:若要对显示对象应用转换矩阵,请创建一个 Transform 对象,将其matrix属性设置为转换矩阵,然后将显示对象的transform属性设置为 Transform 对象。

简单来说就是

显示对象.transform.matrix = new Matrix(); //伪代码

写实验代码的时候感觉是以一种复制了一个新的Matrix对象放在DisplayObject中,或者其实我们平时操作显示对象的rotation,x,y什么的值其实就是操作了显示对象的Matrix对象?呵呵··猜测···

B:在某些方法的参数中使用Matrix,例如bitmapdata.draw(),graphics.beginBitmapFill()等等

三,转换矩阵的基本结构:3x3矩阵


二维转换矩阵不设置uvw值,所以永远默认为u=0,v=0,w=1。

构造函数如下Matrix(a:Number = 1, b:Number = 0, c:Number = 0, d:Number = 1, tx:Number = 0, ty:Number = 0)

四,转换矩阵主要进行4种操作:平移,缩放,旋转,倾斜

底层的方法是可以设置具体的abcd,tx,ty值,不过比较难记,涉及一些三角函数什么的(待深入了解点1),不过还好真正运用的时候有对应封装的方法。

平移:translate(dx:Number, dy:Number):void

缩放:scale(sx:Number, sy:Number):void

旋转:rotate(angle:Number):void

倾斜:无;必须设置属性b 和 c .以平行于x轴或y轴的方向逐渐滑动图像。 Matrix 对象的b属性表示斜角沿y轴的正切;Matrix 对象的c属性表示斜角沿x轴的正切。(待深入了解点2)

五,公共属性部分

矩阵的公共属性比较简单,就是之前介绍的六大数值a,b,c,d,tx,ty。恩,没难点,跳过。

六,公共方法部分

让我数数,1,2,3,4····总共有13个公共方法,让我们来一个一个过一次。

1,构造方法

Matrix(a:Number = 1, b:Number = 0, c:Number = 0, d:Number = 1, tx:Number = 0, ty:Number = 0)

介绍过了。

2,克隆方法

clone():Matrix

因为矩阵是复杂数据类型。复杂数据类型和简单数据类型的区别是,简单数据类型每次都会直接在内存中开辟新的空间,而复杂数据类型除非使用new关键字,一般简单的a=b赋值只会赋对应的内存引用。所以这个clone()方法就是简单为了创建一个相同的Matrix对象而使用的。

3,连接方法

concat(m:Matrix):void

这个有点意思,帮助的介绍是说“将某个矩阵与当前矩阵连接,从而将这两个矩阵的几何效果有效地结合在一起。”经过阅读具体说明后,他说的大意是把两个矩阵的变形效果结合起来。(待试验

4,统一变化方法

createBox(scaleX:Number, scaleY:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void

创建盒子?这名字真让人迷糊。不过看参数的意思应该很明白,就是把之前的translate,scale,rotate方法一次性设置了。

5,给渐变填充用的方法

createGradientBox(width:Number, height:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void

这个主要用来设置在Graphics.beginGradientFill()Graphics.lineGradientStyle()方法所需的矩阵

6,deltaTransformPoint

deltaTransformPoint(point:Point):Point

真迷糊,这算啥玩意···初步看介绍说的是输入一个点的坐标,返回经过矩阵转换后新的点的坐标,但这个转换不包括tx和ty上的转换,就是不考虑x,y的位移,delta的意思就是三角函数。这个还能理解。

问题是,有啥用????(待深入了解点3)

7,indentity清空函数

identity():void

这名字,越来越迷糊了。

作用是将矩阵之前的变化清空,即讲矩阵的六大属性设置为初始值。

举个例子,如果我想两步操作把一个显示对象右移50个像素,可以这样写

_matrix.translate(25,0); //tx=25

_sprite.transform.matrix = _matrix; //移动了25个像素

_matrix.translate(25,0); //tx=25+25=50

_sprite.transform.matrix = _matrix; //又移动了25个像素,总共移动了50个像素

这里的矩阵变化是累加的,而如果我在中间加入indentity

_matrix.translate(25,0); //tx=25;

_sprite.transform.matrix = _matrix; //移动了25个像素

_matrix.indentity(); //tx=0

_matrix.translate(25,0); //tx=25

_sprite.transform.matrix = _matrix; //移动了25个像素

8,invert反转函数

invert():void

作用是将矩阵的数值设置相反,例如原来的tx=50,则运行后tx=-50,反正就是统统都相反,原来向左移50像素,用完后就是像右移50个像素;原来是放大1倍,用完后就是缩小一倍,举个例子

_matrix.translate(25,0); //tx=25;

_sprite.transform.matrix = _matrix; //向右移动了25个像素

_matrix.invert(); //tx=-25

_sprite.transform.matrix = _matrix; //向左移动了25个像素

函数的目的应该是为了撤销上一步操作,但是可能会有什么好玩的用法呢?

9,旋转

rotate(angle:Number):void

其中一种转换,不解释

10,缩放

scale(sx:Number, sy:Number):void

也是一种转换,不解释

11,转成文本

toString():String

不解释

12,transformPoint

transformPoint(point:Point):Point

作用跟detlaTransformPoint大同小异,不过是包含了tx和ty的位移。问题还是一样的,有啥用????

13,位移

translate(dx:Number, dy:Number):void

转换的其中一种,不解释

总结:罗罗嗦嗦了一大堆,也算对Matrix这个类有了一定的认识,以后看到别人代码里的一对0101啥的也没那么怵了,了解了基础知识就有了底气。

其实说回来,矩阵的在图形学里面有着很强大的作用,在AS3里显示对象的转换的几乎很少用到他,但是在滤镜和视觉特效中还是有大作用的。

以后还会继续写一些比较不常用但很重要的API介绍,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值