从CGAffineTransform中查找比例值

时间:2011-10-15 05:17:22

标签: iphone objective-c ios ipad core-graphics

好的,所以我意识到我可以从图层的CATransform3D中找到这样的比例值:

 float scale = [[layer valueForKeyPath: @"transform.scale"] floatValue];

但我不能为我的生活弄清楚如何从CGAffineTransform中找到比例值。比方说我有这个名为“cameraTransform”的CGAffineTransform:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
CGAffineTransform *cameraTransform =  imagePicker.cameraViewTransform;

现在如何从cameraTransform获取比例值?

3 个答案:

答案 0 :(得分:6)

我尝试给出各种CGAffineTransforms的一般答案,即使是旋转的CGAffineTransforms。

假设您的CGAffineTransform包含(可选)

  • 旋转
  • 翻译
  • 缩放

  • 没有倾斜

然后是一个通用公式,为您提供比例因子:

CGAffineTransform transform = ...;
CGFloat scaleFactor = sqrt(fabs(transform.a * transform.d - transform.b * transform.c));

“镜像”或翻转坐标方向将被忽略,这意味着(x - > -x; y - > y)将导致scaleFactor == 1而不是-1。

答案 1 :(得分:2)

http://en.wikipedia.org/wiki/Determinant

“可以对具有实数条目的方阵的行列式的值进行几何解释:行列式的绝对值给出在相关线性变换下乘以面积或体积的比例因子,而其符号指示变换是否保留方向。因此,当应用于具有有限区域的平面区域时,具有行列式-2的2×2矩阵将该区域变换为具有两倍面积的区域,同时反转其方向。“

本文接着给出了3x3矩阵和2x2矩阵的行列式的公式。 CGAffineTransforms是3x3矩阵,但它们的右列始终为0 0 1.结果是行列式将等于矩阵的2x2左上方的行列式。因此,您可以使用结构中的值并自行计算比例。

答案 2 :(得分:0)