根据其转换矩阵获取UIImageView的旋转和大小

Spa*_*Dog 3 iphone iphone-sdk-3.0

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

我想这些矩阵不知何故包含这两个信息.问题是如何提取它......

任何线索?

谢谢你的帮助.

adu*_*din 9

一点矩阵代数和三角恒等式可以帮助您解决这个问题.

我们将继续生成一个可以缩放和旋转的矩阵,然后使用它来计算出如何分析地提取比例因子和旋转.

由Sx(在X轴上)和Sy(在Y轴上)缩放的缩放矩阵如下所示:

?Sx  0 ?
?0   Sy?
Run Code Online (Sandbox Code Playgroud)

R弧度顺时针旋转的矩阵如下所示:

?cos(R)   sin(R)?
?-sin(R)  cos(R)?
Run Code Online (Sandbox Code Playgroud)

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

?Sx.cos(R)   Sx.sin(R)?
?-Sy.sin(R)  Sy.cos(R)?
Run Code Online (Sandbox Code Playgroud)

请注意,线性变换也可能包括剪切或其他变换,但我会假设这个问题只发生了旋转和缩放(如果剪切变换在矩阵中,那么跟随代数会产生不一致的结果;但是可以使用相同的方法来确定分析解决方案).

CGAffineTransform具有四个成员A,B,C,d,对应于2维矩阵:

?a  b?
?c  d?
Run Code Online (Sandbox Code Playgroud)

现在我们想从这个矩阵中提取Sx,Sy和R的值.我们可以在这里使用一个简单的三角恒等式:

tan(A) = sin(A) / cos(A)
Run Code Online (Sandbox Code Playgroud)

我们可以使用矩阵的第一行来得出结论:

tan(R) = Sx.sin(R) / Sx.cos(R) = b / a    and therefore    R = atan(b / a)
Run Code Online (Sandbox Code Playgroud)

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

a = Sx.cos(R)    and therefore    Sx = a / cos(R)
d = Sy.cos(R)    and therefore    Sy = d / cos(R)
Run Code Online (Sandbox Code Playgroud)

所以你现在知道Sx,Sy和R.