iphone - punto - graficas 3d mathematica
¿Cómo compensar el sistema de coordenadas invertido de los gráficos centrales para dibujar fácilmente? (5)
Es realmente un dolor, pero siempre que dibuje un UIImage en -drawRect: es al revés.
Cuando cambio las coordenadas, la imagen se dibuja correctamente, pero al costo de todas las demás funciones de CG, el dibujo es "incorrecto" (volteado).
¿Cuál es tu estrategia cuando tienes que dibujar imágenes y otras cosas? ¿Hay alguna regla general de cómo no atascarse en este problema una y otra vez?
Además, una cosa desagradable cuando muevo el eje y es que mi CGRect del marco UIImageView está mal. En lugar de que el origen aparezca en la parte superior izquierda 10,10 como se esperaba, aparece en la parte inferior.
Pero al mismo tiempo, todas esas funciones normales de dibujo lineal de CGContext toman las coordenadas correctas. dibujar una línea en -drawRect con origen 10,10 arriba a la izquierda, realmente comenzará en la parte superior izquierda. Pero al mismo tiempo, eso es extraño, porque los gráficos centrales en realidad tienen un sistema de coordenadas invertido con y 0 en la parte inferior.
Así que parece que algo es realmente inconsistente allí. Dibujar con las funciones de CGContext toma las coordenadas como "esperadas" (cmon, nadie piensa en coordenadas comenzando desde la parte inferior izquierda, eso es una tontería), mientras que dibujar cualquier tipo de imagen aún funciona de manera "incorrecta".
¿Usas métodos de ayuda para dibujar imágenes? ¿O hay algo útil que hace que el dibujo de la imagen no sea un dolor en el trasero?
Es realmente un dolor, pero siempre cuando dibujo un UIImage en -drawRect :, está al revés.
¿Le está diciendo a UIImage que dibuje, o obtiene su imagen CG y dibuja eso?
Como se señala en "Cómo dibujar en un contexto gráfico en el iPhone OS" , UIImages es consciente de la diferencia en los espacios de coordenadas y debe dibujarse correctamente sin que usted tenga que voltear su espacio de coordenadas.
La mejor respuesta a este problema es usar el método UIImage
drawInRect:
para dibujar su imagen. Supongo que desea que la imagen abarque todos los límites de su vista. Esto es lo que escribirías en tu método drawRect:
En lugar de:
CGContextRef ctx = UIGraphicsGetCurrentContext();
UIImage *myImage = [UIImage imageNamed:@"theImage.png"];
CGImageRef img = [myImage CGImage];
CGRect bounds = [self bounds];
CGContextDrawImage(ctx, bounds, img);
Escribe esto:
UIImage *myImage = [UIImage imageNamed:@"theImage.png"];
CGRect bounds = [self bounds];
[myImage drawInRect:bounds];
Problema: el origen está en la esquina inferior izquierda; y positiva va hacia arriba (y negativa va hacia abajo).
Objetivo: Origen en la esquina superior izquierda; Positivo y va hacia abajo (negativo y va hacia arriba).
Solución:
- Mueve el origen hacia arriba por la altura de la vista.
- Negar (multiplicar por -1) el eje y.
La forma de hacer esto en el código es translate hacia arriba por la altura y scale límites de la vista por (1, -1), en ese orden.
Hay un par de partes de la Guía de programación de Quartz 2D que son relevantes para este tema, incluido "Cómo dibujar en un contexto gráfico en el sistema operativo del iPhone" y todo el capítulo sobre Transformaciones . Por supuesto, deberías leer todo el asunto.
Puede hacerlo aplicando affinetransform en el punto que desee convertir en coordenadas relacionadas con UIKit. A continuación se muestra un ejemplo.
// Create a affine transform object
CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
// First translate your image View according to transform
transform = CGAffineTransformTranslate(transform, 0, - imageView.bounds.size.height);
// Then whenever you want any point according to UIKit related coordinates apply this transformation on the point or rect.
// To get tranformed point
CGPoint newPointForUIKit = CGPointApplyAffineTransform(oldPointInCGKit, transform);
// To get transformed rect
CGRect newRectForUIKit = CGRectApplyAffineTransform(oldPointInCGKit, transform);
CGImageRef flip (CGImageRef im) {
CGSize sz = CGSizeMake(CGImageGetWidth(im), CGImageGetHeight(im));
UIGraphicsBeginImageContextWithOptions(sz, NO, 0);
CGContextDrawImage(UIGraphicsGetCurrentContext(),
CGRectMake(0, 0, sz.width, sz.height), im);
CGImageRef result = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
UIGraphicsEndImageContext();
return result;
}
Llame al método anterior utilizando el código siguiente: Este código trata de obtener la mitad izquierda de una imagen de una vista UIImage existente y configurar la imagen generada de este modo a una nueva vista de imagen - imgViewleft
CGContextRef con = UIGraphicsGetCurrentContext();
CGContextDrawImage(con,
CGRectMake(0,0,sz.width/2.0,sz.height),
flip(leftReference));
imgViewLeft = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];