2011-10-15 10 views
7

Ok, así que me di cuenta que puedo encontrar el valor de escala de CATransform3D de una capa como esto:Encuentra escala de valores de CGAffineTransform

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

Pero no puedo por la vida de a averiguar cómo iba a encontrar el valor de escala de un CGAffineTransform. Digamos por ejemplo que tengo esta CGAffineTransform llamado "cameraTransform":

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

Ahora, ¿cómo puedo obtener el valor de la escala de cameraTransform?

Respuesta

2

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

"una interpretación geométrica se puede dar al valor del determinante de una matriz cuadrada con elementos reales: el valor absoluto del determinante da el factor de escala por el cual el área o el volumen se multiplica bajo el asociado transformación lineal, mientras que su signo indica si la transformación conserva la orientación. Por lo tanto, una matriz 2 × 2 con determinante -2, cuando se aplica a una región del plano con área finita, transformará esa región en una con el doble del área, mientras invierte su orientación."

El artículo pasa a dar fórmulas para el determinante de una matriz de 3x3 y una matriz de 2x2. CGAffineTransforms son matrices 3x3, pero su columna derecha es siempre 0 0 1. El resultado es que el determinante será igual al determinante del cuadrado superior izquierdo 2x2 de la matriz. Entonces puede usar los valores de la estructura y calcular la escala usted mismo.

+2

Esta es la mejor manera de hacerlo. ¡Gracias determinante! Por cierto, obtendrás la escala global, no valores distintos para la dirección xy la dirección y. Creo que puede obtener esos valores separados con las fórmulas scale_x = sqrt (a^2 + c^2), scale_y = sqrt (b^2 + d^2) donde a = transform.a, etc. – Abramodj

6

Intento dar una respuesta general para todo tipo de CGAffineTransforms, incluso rotados.

Asumiendo que su CGAffineTransform contiene (opcionalmente)

  • rotación
  • traducción
  • escalar

y

  • NO inclinación

entonces el que hay una fórmula general que da el factor de escala:

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

"Mirroring" o voltear direcciones de coordenadas será ignorado, que los medios (x -> -x; y -> y) dará como resultado scaleFactor == 1 en lugar de -1.

+0

Me salvó un viaje al libro de álgebra! –

Cuestiones relacionadas