Kapitel 17. Einführung in die Computergrafik

Jeder Entwickler kennt die Situation, wenn das Interface „fast funktioniert”, aber visuell ungenau aussieht: Elemente verschieben sich um ein Pixel, Proportionen brechen beim Skalieren, und Farben verhalten sich auf verschiedenen Bildschirmen unvorhersehbar. Diese Kleinigkeiten sind im Code unsichtbar, aber genau sie verraten unprofessionelle Grafik.

Dieses Kapitel führt behutsam zum verborgenen Fundament jedes grafischen Qt-Subsystems. Hier wird offenbart, wie man nicht in Widgets, sondern in Geometrie denkt, und warum das Verständnis der grundlegenden Primitive direkt die Stabilität von Interfaces, die HiDPI-Anpassung und die Qualität des visuellen Ergebnisses beeinflusst. Dabei werden Sie entdecken, dass viele „magische” Qt-Effekte auf einfachen, aber streng definierten mathematischen Modellen basieren.

Mehrere Schlüssel-Geometrieobjekte werden betrachtet, Methoden ihrer Kombination sowie Prinzipien der Arbeit mit Farbmodellen, die professionelle Entwickler verwenden. Es wird gezeigt, wie dieselben Daten grundlegend unterschiedliche visuelle Effekte erzeugen können — ohne eine einzige Zeile überflüssigen Code.

Das Überspringen dieses Kapitels ist oft teuer: Verlorene Zeit beim Debugging, visuelle Artefakte und komplexe Workarounds dort, wo ein korrekter grundlegender Ansatz ausreicht.

Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.

Selbstüberprüfung zum Kapitel

Warum hat die Methode manhattanLength() diesen Namen erhalten und was berechnet sie?Antwort
Richtige Antwort: Die Methode ist nach den rechtwinkligen Straßen Manhattans benannt und gibt die Summe der Absolutwerte der X- und Y-Koordinaten zurück, was eine Annäherung an die tatsächliche Entfernung bei Bewegung entlang rechtwinkliger Achsen ist.
Was ist der Hauptunterschied zwischen den Farbmodellen HSV und HSL?Antwort
Richtige Antwort: HSV verwendet den Parameter Value (Helligkeit), wobei der Maximalwert eine reine Farbe ergibt, während HSL Lightness (Leuchtdichte) verwendet, wobei der mittlere Wert (127 oder 0.5) volle Sättigung ergibt und das Maximum Weiß.
Warum wurde im Modell CMYK eine separate schwarze Farbe (K) hinzugefügt, wenn sie theoretisch durch Mischen der drei Grundfarben erzielt werden kann?Antwort
Richtige Antwort: Das Mischen der drei Farben (Cyan, Magenta und Gelb) ist tintenwirtschaftlich ineffizient und ergibt in der Praxis kein reines Schwarz, daher wird im Druck eine separate schwarze Farbe verwendet.
Welches Ergebnis liefert die Operation QPoint(10, 20) + QPoint(30, 15) und warum?Antwort
Richtige Antwort: Das Ergebnis ist QPoint(40, 35), da bei der Addition von Punkten eine paarweise Addition ihrer Koordinaten erfolgt: X mit X und Y mit Y.
Warum wird das Modell RGB als “additiv” bezeichnet und CMYK als “subtraktiv”?Antwort
Richtige Antwort: RGB ist additiv — Farben werden durch Hinzufügen von Licht erzeugt, je mehr Licht, desto näher an Weiß. CMYK ist subtraktiv — Farben werden durch Subtraktion von Weiß erzielt, indem angegeben wird, welche Farbmenge ausgeschlossen werden soll.
Wie verhält sich die Methode scale() mit dem Modus Qt::KeepAspectRatioByExpanding beim Skalieren einer Größe von 320×240 auf einen Bereich von 400×600?Antwort
Richtige Antwort: Die Größe wird 800×600, da dieser Modus über den angegebenen Bereich hinausgehen kann und die gesamte Fläche unter Beibehaltung der Originalproportionen füllt.
Was ist der praktische Unterschied zwischen präfixem ++size.rwidth() und postfixem size.rwidth()++ Inkrement?Antwort
Richtige Antwort: Das Postfix-Inkrement gibt den alten Wert vor der Erhöhung zurück, das Präfix-Inkrement erhöht zuerst und gibt den bereits aktualisierten Wert zurück. Dies ist wichtig bei der Zuweisung des Ergebnisses an eine Variable.
Warum wird die letzte Komponente des CMYK-Modells Key color und nicht Black genannt?Antwort
Richtige Antwort: Der Buchstabe “B” von Black wird bereits für die blaue Farbe (Blue) im RGB-Modell verwendet, daher wird zur Vermeidung von Verwirrung der Begriff Key color verwendet.
Wann sollte man QPoint anstelle von QPointF verwenden und umgekehrt?Antwort
Richtige Antwort: QPoint wird für Pixelkoordinaten und Fälle verwendet, wo ganzzahlige Genauigkeit benötigt wird (Widgets, Fenster). QPointF wird für präzise geometrische Berechnungen, Skalierung und Transformationen verwendet, wo Fließkommagenauigkeit wichtig ist.
Wie verändern die Methoden lighter() und darker() der Klasse QColor die Farbe auf interner Ebene?Antwort
Richtige Antwort: Die Methoden konvertieren die Farbe von RGB zu HSV, multiplizieren (lighter) oder dividieren (darker) dann die Value-Komponente mit dem übergebenen Faktor in Prozent, konvertieren anschließend zurück zu RGB und geben ein neues Farbobjekt zurück.
Warum ist in Qt die Y-Achse nach unten und nicht nach oben gerichtet wie im mathematischen Koordinatensystem?Antwort
Richtige Antwort: Dies entspricht der Zeichenreihenfolge auf dem Bildschirm — Pixelzeilen werden von oben nach unten ausgegeben, was historisch mit dem Funktionsprinzip von Kathodenstrahlröhren und modernen Displays zusammenhängt.
Warum ist das Modell HSL für Designer oft intuitiver im Vergleich zu RGB?Antwort
Richtige Antwort: HSL ermöglicht unabhängige Kontrolle von Farbton und Leuchtdichte, was näher daran ist, wie Menschen Farbe wahrnehmen, im Gegensatz zu RGB, wo die Änderung eines Kanals sowohl Farbton als auch Helligkeit gleichzeitig beeinflusst.

Praktische Aufgaben

Einfaches Level

Rechner für Entfernungen zwischen Punkten
Erstellen Sie eine Anwendung, die Koordinaten zweier Punkte (QPoint) annimmt und berechnet: die Manhattan-Entfernung zwischen ihnen, das Ergebnis ihrer Addition und Subtraktion. Geben Sie alle Ergebnisse in der Konsole und über QLabel im Fenster aus.
Hinweise: Verwenden Sie die Methode manhattanLength() für das Objekt, das durch Subtraktion der Punkte erhalten wurde. Additions- und Subtraktionsoperationen von Punkten werden komponentenweise ausgeführt. Erstellen Sie QLabel zur Anzeige der Ergebnisse in einem lesbaren Format.
Mittleres Level

Farbpaletten-Generator
Entwickeln Sie eine Anwendung, die eine Basisfarbe im RGB-Format annimmt und eine Palette aus 5 Farben generiert: die ursprüngliche, zwei hellere Schattierungen (lighter mit Koeffizienten 120 und 150) und zwei dunklere (darker mit Koeffizienten 120 und 150). Zeigen Sie jede Farbe in einem separaten QLabel mit Hintergrund der entsprechenden Farbe an und geben Sie ihre Werte in RGB und HSV aus.
Hinweise: Verwenden Sie die Methoden lighter() und darker() der Klasse QColor. Zur Einstellung der Hintergrundfarbe verwenden Sie setStyleSheet mit dem Parameter background-color. Erhalten Sie RGB- und HSV-Werte über die Methoden getRgb() und getHsv(). Ordnen Sie QLabel horizontal mit QHBoxLayout an.
Schwieriges Level

Visualisierer für Bildskalierung
Erstellen Sie eine Anwendung zur Demonstration der drei QSize-Skalierungsmodi: IgnoreAspectRatio, KeepAspectRatio und KeepAspectRatioByExpanding. Der Benutzer gibt die ursprüngliche Bildgröße und den Zielbereich ein, das Programm zeigt visuell alle drei Skalierungsvarianten als Rechtecke in verschiedenen Farben mit Größenbeschriftungen an. Fügen Sie die Möglichkeit hinzu, ein Farbmodell (RGB/HSV/HSL) für die Rechteckfüllung auszuwählen.
Hinweise: Verwenden Sie QPainter zum Zeichnen von Rechtecken. Erstellen Sie drei QSize-Objekte und wenden Sie auf sie die Methode scale() mit verschiedenen Modi an. Verwenden Sie für das Zeichnen QRect mit aus QSize berechneten Koordinaten. Implementieren Sie QComboBox zur Auswahl des Farbmodells. Verwenden Sie QSpinBox zur Größeneingabe. Vergessen Sie nicht, die Anzeige zu skalieren, wenn die Größen zu groß für das Fenster sind.

💬 Werden Sie Teil der Diskussion!

Haben Sie Farbmodelle und Geometrie-Klassen verstanden? Fragen dazu, wann RGB und wann HSL zu verwenden ist?

Vielleicht haben Sie interessante Erkenntnisse zur Optimierung der Arbeit mit QColor oder praktische Tipps zur Wahl zwischen ganzzahligen und Fließkomma-Geometrieklassen?

Teilen Sie Ihre Erfahrungen mit Grafik in Qt, stellen Sie Fragen oder helfen Sie anderen Lesern, die Nuancen der Computergrafik zu verstehen!

Leave a Reply

Your email address will not be published. Required fields are marked *