2011-10-15 25 views
7

Ok, vì vậy tôi nhận ra tôi có thể tìm thấy giá trị quy mô từ CATransform3D một lớp như thế này:Tìm Scale Giá trị từ CGAffineTransform

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

Nhưng tôi không thể cho cuộc sống của tôi ra thế nào tôi sẽ tìm ra giá trị quy mô từ CGAffineTransform. Ví dụ: tôi có CGAffineTransform này được gọi là "cameraTransform":

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

Bây giờ làm cách nào để có được giá trị quy mô từ cameraTransform?

Trả lời

2

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

"Một giải thích hình học có thể được trao cho các giá trị của các yếu tố quyết định của một ma trận vuông với mục thực tế: giá trị tuyệt đối của yếu tố quyết định cung cấp cho các yếu tố quy mô bởi đó diện tích hoặc khối lượng được nhân dưới sự liên quan Vì vậy, một ma trận 2 × 2 với định thức −2, khi được áp dụng cho một vùng của mặt phẳng với diện tích hữu hạn, sẽ biến đổi vùng đó thành một với hai lần diện tích, trong khi đảo ngược nó sự định hướng."

Bài viết tiếp tục cung cấp công thức cho yếu tố quyết định của ma trận 3x3 và ma trận 2x2. CGAffineTransforms là các ma trận 3x3, nhưng cột phải của chúng luôn luôn là 0 0 1. Kết quả là yếu tố quyết định sẽ bằng với yếu tố quyết định của hình vuông 2x2 bên trái của ma trận. Vì vậy, bạn có thể sử dụng các giá trị từ cấu trúc và tự tính tỷ lệ.

+2

Đây là cách hay nhất để thực hiện. Cảm ơn quyết định! Bằng cách làm như vậy bạn sẽ nhận được quy mô toàn cầu, không phải giá trị riêng biệt cho hướng x và hướng y. Tôi nghĩ bạn có thể nhận các giá trị riêng biệt đó bằng các công thức scale_x = sqrt (a^2 + c^2), scale_y = sqrt (b^2 + d^2) trong đó a = transform.a, v.v. – Abramodj

6

Tôi cố gắng đưa ra một câu trả lời chung cho tất cả các loại CGAffineTransforms, thậm chí cả các loại xoay vòng.

Giả sử CGAffineTransform của bạn có chứa (tùy chọn)

  • xoay
  • dịch
  • rộng

  • NO nghiêng

thì có một công thức chung cung cấp cho bạn các yếu tố quy mô:

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

"Mirroring" hoặc lật phối hợp hướng sẽ bị bỏ qua, đó là phương tiện (x -> -x; y -> y) sẽ dẫn đến scaleFactor == 1 thay vì -1.

+0

Đã lưu cho tôi một chuyến đi đến cuốn sách đại số! –

Các vấn đề liên quan