2012-02-23 20 views
5

Sto cercando di capire il sistema di coordinate quarzo 2d, Attualmente sto leggendo la guida di riferimento Apple e il vecchio libro "Quartz 2d graphics for mac os x developer".Impossibile capire la trasformazione del sistema di coordinate della core grafica iOS, ho bisogno di assistenza

Capisco il concetto di spazio utente e il concetto di spazio del dispositivo che lo spazio del dispositivo può avere un diverso sistema di coordinate di default e le coordinate dello spazio del dispositivo non possono essere modificate, e mappiamo lo spazio utente modificando il suo sistema di coordinate allo spazio del dispositivo per raggiungere il risultato del desiderio.


  • prima parte del problema

quarzo grafica 2D per Mac Book os x sviluppatore dice:

Quando si trasforma un sistema di coordinate, è necessario disporre di un altro sistema di coordinate per confrontarlo con. La trasformazione fornisce un mapping relativo da un sistema di coordinate all'altro. Quando si estrae nel sistema di coordinate trasformate, la trasformazione mappa il grafico sul primo sistema di coordinate. L'aspetto di quella grafica nel sistema di coordinate fisso è influenzata dalla trasformazione .

non ho ricevuto questo punto in grassetto.

E

Quartz 2D programming guide dice:

quarzo compie l'indipendenza dispositivo con un separato coordinate sistema-user space-mappatura al sistema di coordinate dell'uscita dispositivo-dispositivo di dimensioni utilizzando la corrente matrice di trasformazione o CTM. Una matrice è un costrutto matematico utilizzato per descrivere in modo efficiente un set di equazioni correlate. L'attuale matrice di trasformazione è un tipo particolare di matrice chiamato trasformata affine, che mappa i punti da uno spazio di coordinate a un altro applicando la traslazione, la rotazione e le operazioni di ridimensionamento (calcoli che si spostano, ruotano e ridimensionamento di un sistema di coordinate) .

L'attuale matrice di trasformazione ha uno scopo secondario: consente a di trasformare la modalità di disegno degli oggetti. Ad esempio, per disegnare una casella ruotata di 45 gradi, ruotare il sistema di coordinate della pagina (CTM) prima di disegnare la casella. Quartz disegna sul dispositivo di output utilizzando il sistema di coordinate ruotato.

La confusione è che "Quartz richiama al dispositivo di uscita utilizzando il sistema di coordinate ruotato.", Se voglio disegnare un oggetto (immagini, ecc) ruotata e l'altro con la rotazione fuori allora cosa succederà? Abbiamo intere coordinate ruotate ogni cosa che verrà disegnata viene ruotata?

Sto provando diversi esperimenti ma non riesco a capovolgerlo, creo un'immagine il mio disegno due righe replicando il sistema di coordinate in basso a sinistra in photoshop e poi aggiunto al mio progetto per vedere visibilmente come si comportano le coordinate chiamando CGContextRotateCTM(myContext, 45); in metodo drawrect, ma non ha fatto nulla per l'immagine che ho incluso nel file xib usando l'interfaccia builder che inserisce l'immagine all'interno di uiimage.

questo codice da Quartz 2D guida di programmazione

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

ma questo codice sta modificando il testo elaborato sullo schermo non l'immagine che ho aggiunto?


  • Seconda Parte del problema

Questo è anche da Quartz 2D guida di programmazione:

... applicare una trasformazione che si traduce l'origine al in alto a sinistra angolo del contesto PDF e ridimensiona la coordinata y di -1.

L'utilizzo di una trasformazione di ridimensionamento per annullare la coordinata y altera alcune convenzioni nel disegno al quarzo. Ad esempio, se si chiama CGContextDrawImage per disegnare un'immagine nel contesto, l'immagine è modificata dalla trasformazione quando viene disegnata nella destinazione. ...

Sto già facendo questo -1 cosa ma nessun effetto sull'immagine e questa cosa -1 non mi è ancora chiara.

Ho letto più volte questo documento, ho provato a cercare su google ma non sono stati utili tutorial e anche gli ultimi libri sono disponibili solo per i libri scritti nel 2004, 2005, 2006. Qualcuno può aiutarmi o può riferirmi risorse utili a imparare questo in profondità.

Aspettando disperatamente le risposte, ho davvero bisogno di aiuto. Grazie.

risposta

0

Si sta utilizzando una sottoclasse UIImageView e si ignora drawRect? Questo non è supportato (vedi i documenti) ed è probabilmente il motivo per cui la tua immagine non è influenzata da alcuna trasformazione.

Se si vuole fare un sacco di trasformazioni e codice di disegno su misura, allora si dovrebbe utilizzare una sottoclasse UIView e disegno l'immagine utilizzando manualmente CGContextDrawImage()

eventuali trasformazioni vengono applicate alle operazioni effettuate dopo la trasformazione del disegno. Verranno visualizzati esempi di codice nei documenti in cui viene salvato lo stato della grafica, una trasformazione applicata, un disegno eseguito e quindi il contesto viene ripristinato. Questo è il modo in cui disegni alcuni componenti ruotati e altri no.

Speriamo che la seconda parte della domanda diventi chiara una volta che si disegna l'immagine tramite codice CG e non tramite una vista immagine.

+0

sto usando UIView sottoclasse e nella sua drawRect sto scrivendo tutto il codice. voglio solo vedere visibilmente il comportamento delle coordinate e della trasformazione per cui aggiungo l'immagine disegnata di due righe che presenta le coordinate in basso a sinistra che è quarzo 2d di default. Nel file xib ho messo quell'immagine in uiimage. Modifico questa vista non con la sottoclasse in cui sto facendo tutto il codice, quindi l'intera vista è una sottoclasse della classe draw2d che ho creato. grazie per la risposta. – Pamy

+0

Cosa intendi con "nel file xib ho messo l'immagine in UIImage"? Ho letto che questa è una domanda mentre stai creando una visuale utente, dal momento che non puoi creare una UIImage in un file xib. Non capisco come l'hai impostato, puoi inserire alcuni screenshot nella tua domanda? – jrturton

+0

ho draged e lasciato cadere l'immagine utente e in questo ho impostato l'immagine coordinata e non ho fatto nulla, dopo aver fatto questo e scritto il codice di trasformazione tutto mi aspettavo che quell'immagine ruotasse e io visibilmente vedrei dove le coordinate sono ora, quindi posso capire molto facilmente il codice. – Pamy

Problemi correlati