No se puede comprender la transformación del sistema de coorderadas de los charts centrales de iOS, necesita ayuda

Estoy tratando de entender el sistema de coorderadas de cuarzo 2d, actualmente estoy leyendo la guía de reference de Apple y el libro antiguo "Gráficos Quartz 2d para Mac OS X Developer".

Entiendo que el concepto de espacio de usuario y el concepto de espacio de dispositivo es que el espacio de dispositivo puede tener un sistema de coorderadas por defecto diferente y las coorderadas de espacio de dispositivo no pueden modificarse y mapeamos el espacio de usuario modificando su sistema de coorderadas accediendo al espacio del dispositivo para lograr el resultado deseado.


  • Primera parte del problema

Los charts de cuarzo 2d para mac os x developer book dicen:

Al transformar un sistema de coorderadas, debe tener otro sistema de coorderadas para compararlo. La transformación proporciona una asignación relativa de un sistema de coorderadas a otro. Cuando dibuja en el sistema de coorderadas transformado, la transformación asigna el gráfico al primer sistema de coorderadas . La apariencia de ese gráfico en el sistema de coorderadas fijo se ve afectada por la transformación.

No obtuve este punto en negrita.

Y

La guía de progtwigción Quartz 2D dice:

El cuarzo logra la independencia del dispositivo con un sistema de coorderadas separado: espacio de usuario, asignándolo al sistema de coorderadas del dispositivo de salida, espacio del dispositivo, utilizando la matriz de transformación actual o CTM. Una matriz es una construcción matemática utilizada para describir eficientemente un set de ecuaciones relacionadas. La matriz de transformación actual es un tipo particular de matriz llamada una transformación afín, que asigna puntos de un espacio de coorderadas a otro mediante la aplicación de operaciones de traducción, rotation y escala (cálculos que mueven, rotan y cambian el tamaño de un sistema de coorderadas).

La matriz de transformación actual tiene un propósito secundario: le permite transformar cómo se dibujan los objects. Por ejemplo, para dibujar un cuadro girado 45 grados, gira el sistema de coorderadas de la página (el CTM) antes de dibujar el cuadro. El cuarzo se dirige al dispositivo de salida usando el sistema de coorderadas girado.

La confusión es que "el cuarzo se dibuja en el dispositivo de salida usando el sistema de coorderadas rotado". Si quiero dibujar un object (image, etc.) girado y otro sin rotation, ¿qué sucede? ¿Hemos rotado coorderadas enteras cada vez que se dibuja se gira?

Estoy probando diferentes experimentos, pero no puedo concentrarme en esto, creo una image en mi dibujo de dos líneas replicando el sistema de coorderadas de la parte inferior izquierda en photoshop y luego agregué a mi proyecto para ver de manera visible cómo se comportan las coorderadas llamando a CGContextRotateCTM(myContext, 45); en el método drawrect, pero no hizo nada a la image que incluyé en el file xib usando el creador de interfaces colocando la image dentro de uiimage.

este código es de la guía de progtwigción de cuarzo 2D

 CGContextRef myContext = UIGraphicsGetCurrentContext(); CGRect contextRect = self.bounds; CGContextTranslateCTM(myContext, 0, contextRect.size.height); CGContextRotateCTM(myContext, 45); //my modification CGContextScaleCTM(myContext, 1, -1); float w, h; w = contextRect.size.width; h = contextRect.size.height; CGAffineTransform myTextTransform; CGContextSelectFont (myContext, "Helvetica-Bold", h/10, kCGEncodingMacRoman); CGContextSetCharacterSpacing (myContext, 10); CGContextSetTextDrawingMode (myContext, kCGTextFillStroke); CGContextSetRGBFillColor (myContext, 0, 1, 0, .5); CGContextSetRGBStrokeColor (myContext, 0, 0, 1, 1); myTextTransform = CGAffineTransformMakeRotation(0); CGContextSetTextMatrix (myContext, myTextTransform); CGContextShowTextAtPoint (myContext, 0, 50, "Quartz 2D", 9); 

pero este código está modificando el text dibujado en la pantalla, no la image que agregué?


  • Segunda parte del problema

Esto también es de la guía de progtwigción Quartz 2D:

… aplique una transformación que traduzca el origen a la esquina superior izquierda del context PDF y escalar la coorderada y por -1.

Usar una transformación de escala para negar la coorderada y altera algunas convenciones en el dibujo de cuarzo. Por ejemplo, si llama a CGContextDrawImage para dibujar una image en el context, la image se modifica mediante la transformación cuando se dibuja en el destino. …

Ya estoy haciendo esto -1 pero no hay efecto en la image y esto -1 aún no está claro para mí.

He leído este documento varias veces, he intentado search en google, pero no hay un tutorial útil y tampoco hay libros más recientes disponibles, solo libros escritos en 2004, 2005, 2006. ¿Puede alguien ayudarme con esto o puede recomendarme resources útiles para aprender esto en profundidad? .

Desesperadamente esperando respuestas, realmente necesito ayuda. Gracias.

¿Estás usando una subclass UIImageView y anular drawRect? Esto no es compatible (consulte los documentos) y es probable que su image no se vea afectada por ninguna transformación.

Si desea hacer muchas transformaciones y un código de dibujo a medida, entonces debería usar una subclass UIView y dibujar su image manualmente usando CGContextDrawImage ()

Todas las transformaciones se aplican a las operaciones de dibujo realizadas después de la transformación. Verá ejemplos de código en los documentos donde se guarda el estado de charts, se aplica una transformación, se realiza un dibujo y luego se restaura el context. Así es como dibuja algunos componentes rotados y otros no.

Es de esperar que la segunda parte de su pregunta quede clara una vez que esté dibujando su image a través del código CG y no a través de una vista de image.