即使旋转矩阵,也可以获得矩阵的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, B
将0, 1
(指向沿y轴的正侧的x轴)和C, D
将-1, 0
(指向y轴向下的负侧x轴)。
x轴的比例尺是到第一个点的距离。在我提到的情景中,尺度很容易找到。在前面的示例中A, B
是0, 1
因此比例是1.如果旋转角度不是90度增量,则可以使用毕达哥拉斯定理找到从0, 0
到A, B
的线段长度:sqrt(a^2 + b^2)= c。这就是我的代码正在做的事情。
希望这可以帮助别人。
有趣的是,我给出了这个镜头(作为2D矩阵),它确实给出了比例值,但是与DisplayObject的scaleX和scaleY的实际值相比,它们通常会有所不同 - 但只是非常轻微(如4到5个位置小数点后)。尽管如此,答案很棒!谢谢 – bigp 2011-03-15 12:50:52
值得注意的是:我试过deltaTransformPoint(new Point(1,1)),认为产生的x和y是比例值。但是这个不幸并没有给出准确的价值。每个轴必须独立处理。我不是矩阵的天才,但无论如何!这适用于我:) – bigp 2011-03-15 12:55:55
值的差异可能是通过计算长度或矩阵的连接引入的,这意味着除了任何scaleX/1之外,所有祖先的缩放都应用于对象。你可以直接添加到它。在(1,1)变换上:变换点的长度将产生sqrt(2)*(沿Y = X轴的比例因子)。 – merv 2011-03-15 19:11:59