Bastelprojekt Lasershow mit Arduino: Vektorgrafiken an die Wand projizieren

Seite 6: Linienrasterung und Programmablauf

Inhaltsverzeichnis

Die Datei Draw.ino enthält Methoden zum Zeichnen von Linien und Kreisen etwa mit Hilfe des Bresenham-Algorithmus. Unter Umständen ergeben sich damit genauere Resultate, wobei allerdings dann auch die Zeichengeschwindigkeit darunter leiden könnte.

Bei Computergrafiken taucht beim Zeichnen von schrägen Linien das Problem der Rasterung auf. Dabei muss die Linie auf Punkte aufgeteilt werden, die der idealen Linie am nächsten kommen. Wer jetzt denkt: „Es geht hier doch um Vektorgrafik, warum muss da eine Linie gerastert werden?“, der hat theoretisch recht – doch in der Praxis macht hier wie beim Linienzeichnen die Massenträgheit der Galvos der schönen mathematischen Theorie einen Strich durch die Rechnung. Denn soll eine Linie gezeichnet werden, bei der beide Galvos unterschiedlich weit geschwenkt werden müssen – etwa eine flach ansteigende Schräge – dann braucht der eine länger bis zur Endposition und der andere kürzer. Das Ergebnis wäre keine Linie, sondern würde einen deutlichen Knick zeigen. Aus diesem Grund müssen für unsere Lasershow schräge Linien gerastert, sprich: in kurze Stücke aufgeteilt werden. Auf dem Oszilloskop hingegen ist das kein Thema.

Die einfachste Möglichkeit der Rasterung ist die direkte Umsetzung der Geradengleichung, die die Linie definiert:

wobei der Index a die x- und y-Koordinaten des Anfangspunkts der Linie markiert und e jene des Endpunktes. Diese Formel ist jedoch bei Berechnungen sehr langsam, da sie mit Divisionen und damit Gleitkommazahlen arbeitet.

1963 veröffentlichte der amerikanische Informatiker Jack Bresenham einen Algorithmus, der nur ganzzahlige Berechnungen enthält. Durch eine geringfügige Erweiterung lässt sich der ursprüngliche Algorithmus, der für gerade Linien entworfen wurde, auch für die Rasterung von Kreisen verwenden. Beide Varianten des Bresenham-Algorithmus haben wir in den Zeichenroutinen dieses Projekts verwendet.

Der Algorithmus schreitet beim Rastern von Linien immer in der „schnellen“ Richtung einen Schritt (ein Pixel) voran und fügt je nach Steigung hin und wieder zusätzlich einen Schritt in die „langsamere“ Richtung ein.

Der prinzipielle Programmablauf sieht nun folgendermaßen aus:

Voraussetzung für das Ausführen meines „LaserGambling-Frameworks“ sind die Libraries TimerOne.h, Time.h und WiiNunchuck. Diese müssen vorher heruntergeladen und in die Arduino IDE eingebunden werden.

Im setup()-Teil des Arduino-Codes wird mit init_DAC(25) das R2R-Netzwerk vorbereitet und das Timer-Intervall eingestellt. Je kleiner der Wert in der Klammer, desto höher ist die Scanner-Geschwindigkeit. Meine Galvos waren mit einer Geschwindigkeit von 20 Kpps angegeben. Dafür erwies sich ein Timer-Intervall von 22 bis 25 Mikrosekunden als recht gut passend.

Auf beginFrame() folgen Zeichenanweisungen, wie sie in der Tabelle aufgelistet sind. Den Abschluss eines Frames löst der Aufruf von endFrame() aus.

Zeichenbefehle
Befehl Beschreibung
blanking(x, y) Laser positionieren
DrawLine(x, y, color) Linie von der momentanen Position zu den angegebenen Koordinaten zeichnen
DrawCircle(xm, ym, radius, color) Kreis zeichnen aus Mittelpunkt und Radius
DrawSquare(left, top, right, botton, color) Rechteck zeichnen
draw_letter(letter, x, y, color) einzelnen Buchstaben letter schreiben
draw_string(text, x, y, color) Zeichenkette text schreiben
marquee(text, x, y, x_length, color) Lauftext text schreiben; dabei werden x_length Zeichen gleichzeitig angezeigt
drawInt(z, x, y, color) Integer-Zahl z schreiben

Schon während der Stream mit Daten gefüllt wird, bekommen die Galvo-Scanner Timer-gesteuert Anzeigedaten geliefert. Wurde ein Frame komplett angezeigt, wird der nächste abgespielt, sofern der in der Zwischenzeit berechnet wurde. Soll – für ein stehendes Bild – immer wieder der gleiche Frame wiedergegeben werden, so setzt man einfach PointerSet= -1. Damit wird dem Anzeigezeiger vorgegaukelt, dass sich der Befüllzeiger hinter ihm befindet und damit Daten zum Anzeigen vorliegen.