一直觉得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矩阵
构造函数如下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 倾斜:无;必须设置属性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,克隆方法 因为矩阵是复杂数据类型。复杂数据类型和简单数据类型的区别是,简单数据类型每次都会直接在内存中开辟新的空间,而复杂数据类型除非使用new关键字,一般简单的a=b赋值只会赋对应的内存引用。所以这个clone()方法就是简单为了创建一个相同的Matrix对象而使用的。 3,连接方法 这个有点意思,帮助的介绍是说“将某个矩阵与当前矩阵连接,从而将这两个矩阵的几何效果有效地结合在一起。”经过阅读具体说明后,他说的大意是把两个矩阵的变形效果结合起来。(待试验) 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清空函数 这名字,越来越迷糊了。 作用是将矩阵之前的变化清空,即讲矩阵的六大属性设置为初始值。 举个例子,如果我想两步操作把一个显示对象右移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反转函数 作用是将矩阵的数值设置相反,例如原来的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,旋转 其中一种转换,不解释 10,缩放 scale(sx:Number, sy:Number):void 也是一种转换,不解释 11,转成文本 不解释 12,transformPoint transformPoint(point:Point):Point 作用跟detlaTransformPoint大同小异,不过是包含了tx和ty的位移。问题还是一样的,有啥用???? 13,位移 translate(dx:Number, dy:Number):void 转换的其中一种,不解释 总结:罗罗嗦嗦了一大堆,也算对Matrix这个类有了一定的认识,以后看到别人代码里的一对0101啥的也没那么怵了,了解了基础知识就有了底气。 其实说回来,矩阵的在图形学里面有着很强大的作用,在AS3里显示对象的转换的几乎很少用到他,但是在滤镜和视觉特效中还是有大作用的。 以后还会继续写一些比较不常用但很重要的API介绍,敬请期待。 |
AS3 Matrix的一些总结
最新推荐文章于 2024-07-02 19:41:22 发布