前文介绍了利用Matrix类内建方法实现伸缩和映射的例子,本小节介绍如何创建一个自定义函数,实现相同的功能。
伸缩和映射的原理比较简单,假设存在点A(m,n),变形后得到点B(s,t)。在仿射变形方程组中:
s=am+cn+tx
t=bm+dn+ty
如果令b、c为零,通过改变a和d,就能实现显示对象在水平和垂直方向的放缩。
依照这个原理,尝试在例8-9中建立自定义函数flip_V_1():
var objMatrix:Matrix=flipobjbox.flipObj.transform.matrix;
……
function flip_V_1():void
{
flipstep+=0.1;
objMatrix.d=Math.sin(flipstep);
flipobjbox.flipObj.transform.matrix=objMatrix;
}
……
function transtimerHandler(event:TimerEvent):void
{
//动画代码编写入口
//flip_V_0();
flip_V_1();
}
这段代码根据数理原理的分析,通过直接修改显示对象flipObj的内建矩形,试图达到flip_V_0()的相同运行结果。
运行这段程序,其运行结果如图所示:
可以发现程序的运行结果与预期分析不同:显示对象虽然实现了伸缩和映射翻转,但其轴心不是水平中轴线,而是矩形的上部边缘。
当代码直接调用Matrix内建方法时,其行为符合预期;修改显示对象的变形矩阵,却产生了不同的结果。为了解释该问题的原因,需要对映射的内部逻辑进行分析。