2011-10-15 55 views
7

好刻度值,所以我知道我能找到一個圖層的CATransform3D這樣的分度值:查找CGAffineTransform

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

但我不能爲我的生活弄清楚如何我會找到來自CGAffineTransform的縮放值。例如說我有這個CGAffineTransform稱爲「cameraTransform」:

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

現在我如何才能從cameraTransform刻度值?

回答

2

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

「A幾何解釋可以給出與實際條目的正方形矩陣的行列式的值:行列式的絕對值給出了哪個區域或容積根據相關聯乘以所述比例因子線性變換,而它的符號表示變換是否保留了方向,因此當一個行列式爲-2的2×2矩陣應用於有限面積的平面區域時,會將該區域變換爲具有兩倍面積的區域,而將其逆轉方向。」

該文繼續給出3x3矩陣和2x2矩陣行列式的公式。 CGAffineTransforms是3x3矩陣,但它們的右列總是0 0 1.結果是行列式將等於矩陣的2x2左上方的行列式。因此,您可以使用結構中的值並自己計算比例。

+2

這是最酷的方式。感謝行列式!順便說一句,你會得到全球尺度,而不是x方向和y方向的不同值。我認爲你可以通過公式得到這些單獨的值 scale_x = sqrt(a^2 + c^2),scale_y = sqrt(b^2 + d^2) 其中a = transform.a等 – Abramodj

6

我試着給出各種CGAffineTransforms的一般答案,甚至是旋轉的。

假設你CGAffineTransform包含(可選)

  • 旋轉
  • 翻譯
  • 縮放

  • NO歪斜

則有一個通式,讓你的比例因子:

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

「鏡像」或翻轉座標方向將被忽略,這意味着(X - > -x; y - > y)將導致scaleFactor == 1而不是-1。

+0

爲我省下了一本代數書! –