example cgaffinetransformrotate objective-c math cgaffinetransform

objective c - cgaffinetransformrotate - Obtenga solo la transformación de escalamiento de CGAffineTransform



cgaffinetransformrotate swift 3 (5)

Encontré una pregunta similar acerca de cómo obtener solo la rotación, pero a medida que entiendo la escala y el trabajo de rotación son diferentes en la matriz de transformación.

Las matrices no son mi fortaleza, por lo que si alguien me insinuara cómo obtener solo la ampliación de un CGAffineTransform, lo apreciaría enormemente.

por cierto Intenté aplicar el CGAffineTransform en un CGSize y luego obtengo el alto x ancho para ver cuánto se escala, pero el alto x ancho tiene valores extraños (según la rotación encontrada en el CGAffineTransform, así que ... hm eso no funciona)


Es una vieja pregunta (previa a Swift), así que para la gente de Swift que llega aquí basada en una búsqueda de CGAffineTransform aquí hay una extensión de conveniencia de Swift 3 basada en las otras respuestas:

extension CGAffineTransform { var xScale: CGFloat { return sqrt(self.a * self.a + self.c * self.c) } var yScale: CGFloat { return sqrt(self.b * self.b + self.d * self.d) } var rotation: CGFloat { return CGFloat(atan2f(Float(self.b), Float(self.a))) } // .tx and .ty are already available in the transform }


Esa es una pregunta antigua, pero sigo agregando más información en caso de que alguien lo necesite.

Para mí, la buena respuesta y el código de muestra para obtener la escala, la rotación de transformación y para reproducirla son del artículo:

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


No estoy familiarizado con CGAffineTransform o Objective-C (me atrapó con la etiqueta matemática). En general, es necesario retroceder las transformaciones individualmente. Por ejemplo, si la transformación afín A realiza escala, rotación y traslación solamente (el orden de escala y rotación no es importante en el método a continuación, pero la traducción debería ser la última):

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

Escalado en X: aplicar A al vector (1, 0) y obtener (sx0 + tx, sx1 + ty). La escala en X será sqrt (sx0 ^ 2 + sx1 ^ 2)

Escalado en Y: aplique A al vector (0, 1) y obtenga (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 como las transformaciones lineales no son conmutativas, es necesario comprender cómo se ordenan las transformaciones antes de trabajar realmente sobre cómo extraer la transformación individual.


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 entre el factor de escala horizontal y el factor de escala vertical debería ser a/d = -c/b , donde a , b , c y d son cuatro de los seis miembros de CGAffineTransform , según el documentación ( tx y ty solo representan traducción, lo que no afecta los factores de escala).

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


- (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); }