代码之家  ›  专栏  ›  技术社区  ›  Duck

基于变换矩阵求uiImageView的旋转和大小

  •  3
  • Duck  · 技术社区  · 16 年前

    如果我有一个矩形uiImageView的原始变换矩阵,并且这个图像被缩放和旋转,最后我可以读取这个视图的最终变换矩阵,我如何计算缩放和旋转的图像的数量?

    我想这些矩阵包含了这两个信息。问题是如何提取它…

    有什么线索吗?

    谢谢你的帮助。

    1 回复  |  直到 16 年前
        1
  •  9
  •   adurdin    16 年前

    一些矩阵代数和三角恒等式可以帮助你解决这个问题。

    我们将进一步生成一个可缩放和旋转的矩阵,然后用它来计算如何解析地提取比例因子和旋转。

    按sx(x轴)和sy(y轴)缩放的缩放矩阵如下所示:

    ⎡Sx  0 ⎤
    ⎣0   Sy⎦
    

    顺时针旋转r弧度的矩阵如下:

    ⎡cos(R)   sin(R)⎤
    ⎣-sin(R)  cos(R)⎦
    

    使用标准矩阵乘法,缩放和旋转组合矩阵如下所示:

    ⎡Sx.cos(R)   Sx.sin(R)⎤
    ⎣-Sy.sin(R)  Sy.cos(R)⎦
    

    请注意,线性变换也可以包括剪切变换或其他变换,但对于这个问题,我假设只发生了旋转和缩放(如果矩阵中存在剪切变换,则在这里遵循代数会得到不一致的结果;但可以使用相同的方法来确定分析解)。

    A CGAffineTransform 有四个成员a、b、c、d,对应于二维矩阵:

    ⎡a  b⎤
    ⎣c  d⎦
    

    现在我们要从这个矩阵中提取sx、sy和r的值。我们可以在这里使用一个简单的三角恒等式:

    tan(A) = sin(A) / cos(A)
    

    我们可以将其与矩阵的第一行一起使用,得出以下结论:

    tan(R) = Sx.sin(R) / Sx.cos(R) = b / a    and therefore    R = atan(b / a)
    

    现在我们知道了r,我们可以用主对角线来提取比例因子:

    a = Sx.cos(R)    and therefore    Sx = a / cos(R)
    d = Sy.cos(R)    and therefore    Sy = d / cos(R)
    

    所以你现在知道了SX,Sy和R。