6 Stimmen

Ich kann die Transformation des iOS-Kerngrafikkoordinatensystems nicht verstehen und brauche Hilfe

Ich versuche, das Quarz-2d-Koordinatensystem zu verstehen. Derzeit lese ich das Apple Referenzhandbuch und das alte Buch "Quartz 2d graphics for mac os x developer".

Ich verstehe das Konzept des Benutzerraums und des Geräteraums so, dass der Geräteraum ein anderes Standard-Koordinatensystem haben kann und die Koordinaten des Geräteraums nicht geändert werden können, und wir den Benutzerraum abbilden, indem wir sein Koordinatensystem entsprechend dem Geräteraum ändern, um das gewünschte Ergebnis zu erzielen.


  • Erster Teil des Problems

Quartz 2d graphics for mac os x developer book sagt:

Beim Transformieren eines Koordinatensystems, müssen Sie eine andere Koordinatensystem haben, mit dem man es vergleichen kann. Die Transformation liefert eine relative Abbildung von einem Koordinatensystem auf das andere. Wenn Sie im transformierten Koordinatensystem zeichnen, bildet die Transformation die Grafik zurück auf das erste Koordinatensystem . Das Aussehen dieser Grafik im festen Koordinatensystem wird durch den Transformation beeinflusst.

Ich habe diesen fettgedruckten Punkt nicht verstanden.

Und

Quartz 2D Programmieranleitung sagt:

Quartz erreicht die Geräteunabhängigkeit mit einem separaten Koordinatensystem Koordinatensystem - dem Benutzerraum - und ordnet es dem Koordinatensystem des Ausgabegeräts zu Geräts - dem Geräteraum - unter Verwendung der aktuellen Transformationsmatrix (CTM). A Matrix ist ein mathematisches Konstrukt, das zur effizienten Beschreibung eines Satzes von zusammenhängenden Gleichungen zu beschreiben. Die aktuelle Transformationsmatrix ist eine besondere Art von Matrix, eine sogenannte affine Transformation, die Punkte von einem Koordinatenraum in einen anderen durch Anwendung von Translations-, Rotations- und Rotations- und Skalierungsoperationen (Berechnungen, die ein Koordinatensystem verschieben, rotieren und Größenänderung eines Koordinatensystems).

Die aktuelle Transformationsmatrix hat einen zweiten Zweck: Sie ermöglicht die Art und Weise zu verändern, wie Objekte gezeichnet werden. Um zum Beispiel einen Kasten zu zeichnen um 45 Grad gedreht zu zeichnen, drehen Sie das Koordinatensystem der Seite (die CTM), bevor Sie den Rahmen zeichnen. Quarz zeichnet zum Ausgabegerät unter Verwendung des gedrehten Koordinatensystems.

Verwirrend ist, dass "Quartz zeichnet auf das Ausgabegerät mit dem gedrehten Koordinatensystem.", wenn ich ein Objekt (Bild etc.) gedreht und andere ohne Drehung zeichnen wollen, was dann passieren? Wir haben ganze Koordinaten gedreht alles, was gezeichnet wird, ist gedreht?

Ich versuche verschiedene Experimente, aber nicht in der Lage, meinen Kopf zu wickeln um diese, ich ein Bild meine Zeichnung zwei Linie repliziert unten links Koordinatensystem in Photoshop und dann zu meinem Projekt hinzugefügt, um sichtbar zu sehen, wie Koordinaten verhalten sich durch den Aufruf CGContextRotateCTM(myContext, 45); in drawrect-Methode, aber es tat nichts, um Bild, das ich in xib-Datei mit Interface Builder Platzierung Bild innerhalb uiimage enthalten.

Dieser Code stammt aus dem Quarz 2D Programmierhandbuch

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

aber dieser Code ändert den auf dem Bildschirm gezeichneten Text und nicht das Bild, das ich hinzugefügt habe?


  • Zweiter Teil des Problems

Dies ist auch aus dem Quartz 2D Programmierhandbuch:

... eine Transformation anwenden, die den Ursprung in die obere linke Ecke Ecke des PDF-Kontexts verschiebt und die y-Koordinate um -1 skaliert.

Die Verwendung einer Skalierungstransformation zur Negierung der y-Koordinate ändert einige Konventionen beim Zeichnen in Quartz. Zum Beispiel, wenn Sie CGContextDrawImage aufrufen, um ein Bild in den Kontext zu zeichnen, wird das Bild durch die Transformation verändert, wenn es in das Ziel gezeichnet wird. ...

Ich habe bereits diese -1 Sache, aber keine Wirkung auf das Bild und diese -1 Sache ist immer noch nicht klar zu mir.

Ich habe dieses Dokument mehrmals gelesen und versucht, über Google zu suchen, aber es gibt keine nützlichen Anleitungen und auch keine aktuellen Bücher, sondern nur Bücher aus den Jahren 2004, 2005 und 2006. Kann mir jemand diesbezüglich helfen oder mir nützliche Ressourcen nennen, um dies in der Tiefe zu lernen.

Ich warte verzweifelt auf Antworten, ich brauche wirklich Hilfe. Ich danke Ihnen.

3voto

supera Punkte 580

Lesen Sie diesen Leitfaden und ich hoffe, dass alle Ihre Probleme geklärt werden

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html

0voto

jrturton Punkte 115612

Verwenden Sie eine UIImageView-Unterklasse und überschreiben Sie drawRect? Dies wird nicht unterstützt (siehe die Dokumente) und ist wahrscheinlich der Grund, warum Ihr Bild nicht von Transformationen betroffen ist.

Wenn Sie viele Transformationen und maßgeschneiderten Zeichnungscode ausführen möchten, sollten Sie eine UIView-Unterklasse verwenden und Ihr Bild manuell mit CGContextDrawImage() zeichnen.

Alle Transformationen werden auf Zeichenoperationen angewendet, die nach der Transformation durchgeführt werden. In der Dokumentation finden Sie Codebeispiele, bei denen der Grafikstatus gespeichert, eine Transformation angewendet, eine Zeichnung ausgeführt und dann der Kontext wiederhergestellt wird. Auf diese Weise zeichnen Sie einige Komponenten gedreht und einige nicht.

Der zweite Teil Ihrer Frage wird hoffentlich klar, wenn Sie Ihr Bild über CG-Code und nicht über eine Bildansicht zeichnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X