给定2D变换矩阵,如何计算缩放,倾斜,旋转和平移?

时间:2013-12-06 11:10:15

标签: flex math matrix geometry transform

我编写了一个程序(like this),通过用户对缩放,倾斜,旋转和翻译的输入,生成并将变换矩阵应用于对象。

现在我想反过来做:给定转换矩阵,如何计算这些值?矩阵是2D(a,b,c,d,tx,ty)。

我知道这是一个纯粹的数学问题,但我在高中时并不够集中......

2 个答案:

答案 0 :(得分:5)

我在this tutorial找到了很多有用的信息,这些信息为我解决了这个问题。以下是关心人的公式:

翻译(像素)

x := tx

y := ty

比例(时间)

scale_x := sqrt(a^2 + b^2)

scale_y := sqrt(c^2 + d^2)

偏斜(度)

skew_x := 180/pi * atan2(d, c) - 90

skew_y := 180/pi * atan2(b, a)

轮换(度)

这是棘手的部分:旋转不是基本的变换函数;事实上,它是偏斜和规模相结合的结果。您可以通过其xy轴倾斜对象,然后对其进行缩放以使其看起来像已旋转。 x偏斜的角度通常被视为旋转角度:

rotation := skew_x

有时:

rotation := skew_y

答案 1 :(得分:2)

假设操作的平移/旋转/缩放和倾斜顺序,最简单的方法是一次一个地剪掉它们。

  1. 提取最后一列;这是翻译。丢弃它和最后一行。
  2. 找到所得3x3矩阵的QR分解。正交分量是旋转;丢弃并保留上三角形组件。
  3. 上三角分量的对角线是缩放。通过将上三角矩阵乘以缩放的倒数来反转它。
  4. 结果是倾斜矩阵。