通常会询问有关如何缩放DisplayObject的问题,答案通常是使用矩阵。
我的问题是,如何获得矩阵的比例(scaleX和scaleY)?
有一个Matrix.scale方法来设置scaleX和scaleY,但是它没有返回值,也没有其他属性可以读回来。
我问的原因是,我使用的对象深埋到显示列表中,每个都可能被转换。所以我使用了子对象的sprite.transform.concatenatedMatrix getter,但是我现在仍然坚持如何从中读取比例。
房子里有任何数学家吗?
答案 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, B
将0, 1
(指向x轴沿y轴的正侧),C, D
将{ {1}}(将y轴指向x轴的负侧)。
x轴的比例是到第一个点的距离。在我提到的场景中,很容易找到比例。在上一个示例中,-1, 0
为A, B
,因此比例为1.如果旋转未以90度增量开启,则可以找到从0, 1
到{{{{}}}的线段长度1}}使用毕达哥拉斯定理:sqrt(a ^ 2 + b ^ 2)= c。这就是我的代码所做的。
希望这有助于某人。
答案 2 :(得分:0)
您可以访问矩阵对象的a
和d
公共属性,它们分别代表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