2016-03-07 133 views
1

我想制作一个类似于rotateAroundInternalPoint()的功能。到目前为止,我的解决办法是这样的:围绕点的连续物体旋转

import flash.events.Event; 
import flash.geom.Matrix; 
import flash.geom.Point; 

addEventListener(Event.ENTER_FRAME, onFrame); 

function onFrame(e:Event):void 
{ 
    var m:Matrix = item.transform.matrix.clone(); 
    var point:Point = new Point(50, 50); // The object's width and height are 100px, so 50 is the center 
    point = m.transformPoint(point); 
    m.translate(-point.x, -point.y); 

    m.rotate(5 * (Math.PI/180)); 
    m.translate(point.x, point.y); 

    item.transform.matrix = m; 
} 

但是有这个代码的根本缺陷 - 它变得越来越少精确,每次迭代。

有人可以指出是什么原因造成的,以及解决方案是什么?

+0

我仍然接受一个更好的答案,不依赖于参考矩阵,而是依赖于更好的数学。 –

回答

1

我已经解决了引入不会改变的参考矩阵的问题,所以最初的迭代中的错误是不存在的。

这里的实现:

import flash.events.Event; 
import flash.geom.Matrix; 
import flash.geom.Point; 

var referenceMatrix:Matrix = item.transform.matrix.clone(); 

addEventListener(Event.ENTER_FRAME, onFrame); 

var i:Number = 0; // you'll need this because the referenceMatrix rotation will only go one step, so instead you need to increase the rotation 

function onFrame(e:Event):void 
{ 
    var m:Matrix = referenceMatrix.clone(); 
    var point:Point = new Point(100, 100); // pivot point local to the object's coordinates 

    point = m.transformPoint(point); 
    m.translate(-point.x, -point.y); 
    m.rotate(i * (Math.PI/180)); 
    m.translate(point.x, point.y); 
    item.transform.matrix = m; 

    i += 1.2; // rotation step 
} 

请注意,这段代码是写在一个框架和实际使用没有得到很好的优化,而是说明了算法。