2011-10-15 14 views
7

Ok, więc zdaję sobie sprawę, mogę znaleźć wartość skali od CATransform3D warstwa jest tak:Znajdź skali wartości od CGAffineTransform

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

Ale nie mogę dla życia mnie zorientować się, jak znajdę skaluj wartość z CGAffineTransform. Powiedz na przykład mam ten CGAffineTransform nazwie „cameraTransform”:

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

Teraz jak mogę uzyskać wartość skali od cameraTransform?

Odpowiedz

2

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

„interpretacji geometryczne można podawać wartości wyznacznika macierzy kwadratowej z prawdziwymi pozycji: wartość bezwzględna wyznacznika podaje współczynnik skalowania, w którym powierzchnia lub objętość mnoży pod współpracującą transformacja liniowa, podczas gdy jej znak wskazuje, czy transformacja zachowuje orientację, w związku z czym macierz 2 × 2 z wyznacznikiem -2, po zastosowaniu do regionu płaszczyzny o skończonej powierzchni, przekształci ten region w obszar o powierzchni dwukrotnie większej, podczas cofania orientacja."

Artykuł podaje wzory dla wyznacznika macierzy 3x3 i macierzy 2x2. CGAffineTransforms są macierzami 3x3, ale ich prawą kolumną jest zawsze 0 0 1. Wynik jest wyznacznikiem będzie równa wyznacznikowi 2x2 lewego górnego kwadratu macierzy. Możesz więc użyć wartości z struct i samemu obliczyć skalę.

+2

To jest najfajniejszy sposób to zrobić. Dzięki determinant! Przy okazji, otrzymasz skalę globalną, a nie odrębne wartości dla kierunku x i y. Myślę, że możesz uzyskać te oddzielne wartości z formułami: scale_x = sqrt (a^2 + c^2), scale_y = sqrt (b^2 + d^2) gdzie a = transform.a, itp. – Abramodj

6

Próbuję dać ogólną odpowiedź dla wszystkich rodzajów CGAffineTransforms, nawet tych obróconych.

Zakładając, że CGAffineTransform zawiera (opcjonalnie)

  • rotacja
  • tłumaczenie
  • skalowania

i

  • NO pochylać

wówczas istnieje ogólna formuła, która daje współczynnik skali:

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

„Mirroring” lub odwrócenie koordynować kierunki będą ignorowane, że środki (x -> -x; y -> y) spowoduje współczynnik skali == 1 zamiast -1.

+0

Uratował mi podróż do książki algebry! –

Powiązane problemy