比较古老的话题,今天再拿出来扯一下。
flash牛人darron schall早在03年就完成了这么一个类:http://www.darronschall.com/weblog/archives/000054.cfm
算法是在形变前后使用两次localToGlobal和globalToLocal,得到给定注册点的位移差,然后改变mc坐标。
当时是flash7 as2刚出,作者只不过是把算法封装成了类,而这种思想可以在flash5时代就能实现的了。
到了flash8有了geom.matrix和geom.transform以后,实现起来就更方便了。前提是要有预备知识(我就是最近才有,所以再回来研究一下-_-||)
所谓的预备知识,就是“向量与矩阵的乘法”
这个说来话长,简单的说,就是把一个向量通过矩阵变换成另一个向量。
而向量就是注册点,矩阵控制形变,变换后的向量也就是在形变后,相应改变的注册点。
其实两个方法的核心是一样的,都是求形变前和形变后的注册点之差,最后把mc的坐标偏移过去就OK。
两种算法的伪码比较
// --- Flash 5+ var a = {x:this.xreg, y:this.yreg}; this.localToGlobal (a); this._parent.globalToLocal (a); // 形变1 // 形变2 // 形变n var b = {x:this.xreg, y:this.yreg}; this.localToGlobal (b); this._parent.globalToLocal (b); this._x -= b.x - a.x; this._y -= b.y - a.y; // --- Flash 8+ var m:Matrix = this.transform.matrix; var px1:Number = this.xreg * m.a + this.yreg * m.c; var py1:Number = this.xreg * m.b + this.yreg * m.d; // 形变1 // 形变2 // 形变n var m:Matrix = this.transform.matrix; var px2:Number = this.xreg * m.a + this.yreg * m.c; var py2:Number = this.xreg * m.b + this.yreg * m.d; this._x -= px2 - px1; this._y -= py2 - py1;