代码改变世界

动态改变注册点

2008-10-25 01:36  hbb  阅读(419)  评论(0编辑  收藏  举报

比较古老的话题,今天再拿出来扯一下。

flash牛人darron schall早在03年就完成了这么一个类:http://www.darronschall.com/weblog/archives/000054.cfm

算法是在形变前后使用两次localToGlobalglobalToLocal,得到给定注册点的位移差,然后改变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;