AS3:获取Matrix对象的比例

时间:2011-03-14 20:22:13

标签: flash actionscript-3 math matrix scale

通常会询问有关如何缩放DisplayObject的问题,答案通常是使用矩阵。

我的问题是,如何获得矩阵的比例(scaleX和scaleY)?

有一个Matrix.scale方法来设置scaleX和scaleY,但是它没有返回值,也没有其他属性可以读回来。

我问的原因是,我使用的对象深埋到显示列表中,每个都可能被转换。所以我使用了子对象的sprite.transform.concatenatedMatrix getter,但是我现在仍然坚持如何从中读取比例。

房子里有任何数学家吗?

3 个答案:

答案 0 :(得分:3)

通常,在矩阵中隔离缩放分量的可靠​​方法是使用相关矩阵沿轴移动单位向量,然后测量结果向量的长度。

例如,给定DisplayObject中的transform并使用Matrix3D,scaleX将获得如下:

transform.matrix3D.deltaTransformVector(Vector3D.X_AXIS).length

或者,如果您使用连接的2D矩阵,scaleY将是:

transform.concatenatedMatrix.deltaTransformPoint(new Point(0,1)).length

请注意,deltaTransform*函数会忽略矩阵的平移效果,这对缩放没有影响。

答案 1 :(得分:1)

即使矩阵旋转,也可以得到矩阵的x和y刻度。

以下是代码:

public static function getScaleX(m:Matrix):Number
{
    return Math.sqrt(Math.pow(m.a + m.b, 2));
}

public static function getScaleY(m:Matrix):Number
{
    return Math.sqrt(Math.pow(m.c + m.d, 2));
}

说明:

我发现将A B C D视为定义变换坐标空间中x和y轴的点更容易。 A, B是变换后的x轴的第一个点的位置(单位矩阵的值为1, 0,不会变换),而C, D是第一个点的位置。变换后的y轴(0, 1的同一性值)。

如果我们有一个矩阵可以将x轴缩放2,那么A, B将是2, 0。 x轴上的其余点与最后一个点的距离相同(因此距离最后一个点2个点)。

如果我们的矩阵顺时针旋转90度,那么A, B0, 1(指向x轴沿y轴的正侧),C, D将{ {1}}(将y轴指向x轴的负侧)。

x轴的比例是到第一个点的距离。在我提到的场景中,很容易找到比例。在上一个示例中,-1, 0A, B,因此比例为1.如果旋转未以90度增量开启,则可以找到从0, 1到{{{{}}}的线段长度1}}使用毕达哥拉斯定理:sqrt(a ^ 2 + b ^ 2)= c。这就是我的代码所做的。

希望这有助于某人。

答案 2 :(得分:0)

您可以访问矩阵对象的ad公共属性,它们分别代表x轴和y轴的缩放:

package
{
//Imports
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.display.Shape;

//Class
public class Test extends Sprite
    {
    //Constructor
    public function Test()
        {       
        var sh:Shape = new Shape();
        sh.graphics.beginFill(0xFF0000, 1.0);
        sh.graphics.drawRect(0, 0, 100, 100);
        sh.graphics.endFill();

        var scaleMatrix:Matrix = new Matrix();
        scaleMatrix.scale(4, 6);

        sh.transform.matrix = scaleMatrix;

        addChild(sh);

        trace("Matrix X Scale: " + scaleMatrix.a, "\nMatrix Y Scale: " + scaleMatrix.d);
        }
    }
}

// Matrix X Scale: 4 
// Matrix Y Scale: 6