2016-03-07 184 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 
} 

請注意,這段代碼是寫在一個框架和實際使用沒有得到很好的優化,而是說明了算法。