2011-03-14 30 views
1

大多数情况下,有关如何缩放DisplayObject的问题经常被问到,答案通常是使用Matrix。AS3:获取Matrix对象的比例

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

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

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

在房子里的任何数学知识?

回答

3

通常,一个可靠的方法以分离的缩放分量矩阵将使用所讨论的矩阵来沿着轴线变换单位矢量,然后测量结果矢量的长度。

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

或者,如果您使用级联的二维矩阵中,scaleY将是::

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

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

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

+0

有趣的是,我给出了这个镜头(作为2D矩阵),它确实给出了比例值,但是与DisplayObject的scaleX和scaleY的实际值相比,它们通常会有所不同 - 但只是非常轻微(如4到5个位置小数点后)。尽管如此,答案很棒!谢谢 – bigp 2011-03-15 12:50:52

+0

值得注意的是:我试过deltaTransformPoint(new Point(1,1)),认为产生的x和y是比例值。但是这个不幸并没有给出准确的价值。每个轴必须独立处理。我不是矩阵的天才,但无论如何!这适用于我:) – bigp 2011-03-15 12:55:55

+0

值的差异可能是通过计算长度或矩阵的连接引入的,这意味着除了任何scaleX/1之外,所有祖先的缩放都应用于对象。你可以直接添加到它。在(1,1)变换上:变换点的长度将产生sqrt(2)*(沿Y = X轴的比例因子)。 – merv 2011-03-15 19:11:59

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 
+1

忘了提及a和d也代表旋转,所以我的上面的代码将只在你只是缩放时才起作用。 – TheDarkIn1978 2011-03-14 21:29:22

+0

对于我而言,旋转是重要的考虑因素,有些对象将变为90度,总的来说,拥有可以解决任何场景(任何比例,旋转或偏斜)的一体化解决方案都是非常好的。虽然谢谢! – bigp 2011-03-15 11:49:32

0

即使旋转矩阵,也可以获得矩阵的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(指向沿y轴的正侧的x轴)和C, D-1, 0(指向y轴向下的负侧x轴)。

x轴的比例尺是到第一个点的距离。在我提到的情景中,尺度很容易找到。在前面的示例中A, B0, 1因此比例是1.如果旋转角度不是90度增量,则可以使用毕达哥拉斯定理找到从0, 0A, B的线段长度:sqrt(a^2 + b^2)= c。这就是我的代码正在做的事情。

希望这可以帮助别人。