2D-Rasterizer
-
Ich schreibe schon eine Weile an einem kleinen Rasterizer für 2D-Grafiken. Bisher kann ich aber nur einfache Linien, Rechtecke, Kreise und Bitmaps rendern lassen. Ich habe leider keine Idee, wie ich Dinge wie breite Linien (mehr als 1px), gedrehte Rechtecke oder gedrehte Bitmaps umsetzen kann. Gibt es Tutorials zum Thema Rasterung von 2D-Grafik? Ich habe mir schon ein paar OpenSource-Projekte wie Cairo angeschaut, aber die sind einfach zu groß und unverständlich für einen Anfänger.
-
Implementier die Funktionalität zum Rasterisieren von beliebigen Dreiecken; dann kannst du die einzelnen Punkte mit sinus und cosinus transformieren (geht auch mit Bitmaps...) und so gedrehte Sachen rasterizen. Mit Dreiecken kommst du bei diesem Verfahren definitiv am weitesten
-
naja, fuer bilder, schau dir mal rotationsmatrizen an, das duerfte am effektivsten laufen.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also für komplexe polygone kannste das so machen:
Sortiere die Kanten (Seiten) nach absteigenden y Werten (liste der zu bearbeiteten Kanten).
Gehe nun zeilenweise in absteigender Y Richtung vor.
Berechne welche Kanten des Polygons von der aktuellen Zeile geschnitten werden.
Sortiere die geschnittenen Kanten nach x Werten.
Nun entstehen intervalle. Beim Eintritt in ein Interwall (erster Schnitt in x Richtung gesehen) bist du im Inneren des Polygons (Hier Rasterpunkte setzen). Beim nächsten Schnitt biste wieder draußen, dann wieder im Inneren usw.
Die Kanten dessen beide Eckpunkte einen größeren Y Wert haben als die aktuelle Zeile kannst du aus der Liste der zu bearbeitenden Kanten etfernen.
Das machste so lange bis es keiene zu bearbeitenden Kanten mehr gibt.Für breite Linien kannste einfach eine schmale Linie (Breite ein Pixel) wie bisher nehmen.
Rasterisiere diese.
Dann kannst du einfach die gestzten Pixel mit einem Kreis von z.B 3 Pixel Durchmesser übermalen. Schwups breite Linie fertig.
(Leider nur mit ungeraden Linienbreiten)Dann könntest du noch berechnen wie weit ein gesetzter Pixel von der eigentlich zu zeichnenden Linie entfernt ist und ihn dementsprechend mehr oder weniger stark einfärben. (Anti Alias fertig)
usw...
-
Die meisten Anwendungen beschraenken sich auf konvexe Polygone oder lassen sich vorher in konvexe Teile zerlegen.
Definiert man die Eckpunkte in gleichbleibender Reihenfolge muss man nur noch den obersten suchen und die rechte und linke Seite verfolgen.
Triangulierung erhoeht denn Aufwand unnoetig weil meistens Rechtecke Verwendung finden.