2010-04-22 15 views
17

Encontré una pregunta similar sobre cómo obtener solo la rotación, pero como entiendo, la escala y la rotación funcionan de forma diferente en la matriz de transformación.Obtenga la transformación de escalado de CGAffineTransform

Las matrices no son mi fuerza, así que si alguien me insinúa cómo obtener solo la escala de un CGAffineTransform lo agradecería mucho.

btw. Intenté aplicar CGAffineTransform en un CGSize y luego obtuve el alto x ancho para ver cuánto escalaba, pero alto x ancho tiene valores extraños (dependiendo de la rotación encontrada en CGAffineTransform, entonces ... hm eso no funciona)

Respuesta

43

Suponiendo que la transformación es una escala seguida de una rotación (posiblemente con una traducción allí, pero sin sesgo) el factor de escala horizontal es sqrt(a^2+c^2), el factor de escala vertical es sqrt(b^2+d^2), y la relación del factor de escala horizontal al factor de escala vertical debe ser a/d = -c/b, donde a, b, c, y d son cuatro de los seis miembros de la CGAffineTransform, por the documentation (tx y ty solo representan la traducción, lo que no afecta los factores de escala).

| a b 0 | 
| c d 0 | 
| tx ty 1 | 
+0

La primera respuesta obtiene la marca. Ambos un voto arriba. Gracias por poner algo de luz sobre ese –

+1

Aunque tenga en cuenta que la escala extraída de esta manera siempre será positiva (las escalas negativas pueden usarse para voltear el objeto). – thenickdude

4

No estoy familiarizado con CGAffineTransform u Objective-C (me atrapó con la etiqueta matemática). En general, necesita revertir las transformaciones individualmente. Por ejemplo, si la transformación afín A realiza escala, rotación y traslación solamente (la orden de la ampliación y la rotación no es importante en el método de abajo, pero la traducción se debe sin duda ser la última):

Traducción: La aplicación de la A a la el vector (0,0) devolverá el resultado (tx, ty) donde tx y ty son las traducciones en las direcciones X e Y, respectivamente.

Escala en X: Aplicar A en el vector (1, 0) y obtener (sx0 + tx, sx1 + ty). El escalado en X será sqrt (SX0^2 + sx1^2)

Scaling en Y: Aplicar A al vector (0, 1) y obtener (Sy0 + TX, sy1 + ty). La escala en Y será sqrt (sy0^2 + sy1^2)

Dado que las transformaciones afines se implementan mediante un simple truco con transformaciones lineales y dado que las transformaciones lineales no son conmutativas, debe comprender cómo se ordenan las transformaciones antes en realidad está trabajando en cómo sacar la transformación individual.

8

Esa es una vieja pregunta, pero todavía agrego más información en caso de que alguien necesite.

Para mí, el código de buena respuesta y la muestra para conseguir escala, la rotación de transformación y para la reproducción que son de artículo:

http://www.informit.com/articles/article.aspx?p=1951182

+1

gran artículo !!! –

23
- (CGFloat)xscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.a * t.a + t.c * t.c); 
} 

- (CGFloat)yscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.b * t.b + t.d * t.d); 
} 
Cuestiones relacionadas