Der Bresenham–Algorithmus für Strecken
Transcription
Der Bresenham–Algorithmus für Strecken
Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Hausarbeit Themen: - Der Bresenham–Algorithmus für Strecken und - Zylinder - vorgelegt von Michael Frank und Heinz-Joachim Offenburger Fach: Mathematik / Informatik Fachwissenschaftliches Hauptseminar Computergrafik Wintersemester 2003/2004 1 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Der Bresenham–Algorithmus für Strecken Aufgaben Aufgabe 1: Öffne die Datei „Strecke 01 Aufgabe.xls“. 1. Vervollständige die linksstehende Tabelle. Setze die Formeln für x und y ein (-15< x <15). 2. Experimentiere, indem du die Werte m und n variierst Was repräsentieren die Faktoren m und n? 3. Kann die Strecke alle Lagen einnehmen? (Welche Werte müssen für m und n gewählt werden, damit die Strecke a) waagrecht und b) senkrecht verläuft?) Lösung Aufgabe 1: Die Lösungen der Aufgabendatei „Strecke 01 Aufgabe.xls“ kannst du der Datei „Strecke 01 Loesung.xls“ entnehmen. 1. Die Gleichung y = mx + n einer Gerade heißt „Hauptform der Geradengleichung“. Durch n ist der Schnittpunkt Y(0/n) mit der Y-Achse festgelegt, n heißt Y-Achsenabschnitt. Durch m ist die Richtung der Geraden benannt, m heißt die Steigung. 2. Mit der Hauptform der Geradengleichung y = mx + n können mit Ausnahme der Geraden „parallel zur Y-Achse“, alle Geraden des Gleichungstyps y = mx + n in einem Schaubild dargestellt werden Eine zweite Möglichkeit Strecken darzustellen ´besteht in der Anwendung der allgemeinen Geradengleichung. Die Gerade/Strecke wird durch zwei Punkte, die auf der Geraden/Strecke liegen definiert. Vergleiche hierzu die folgende Überführung der Hauptform der Geradengleichung in die allgemeine Geradengleichung. 2 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Aufgabe 2: Öffne die Datei „Strecke 02 Aufgabe.xls“ und variiere die Eingabemöglichkeiten. 1. Lege dar, wie die Steigung m aus Aufgabe 1 hier dargestellt wird. 2. Welche Lagen der Strecken sind hier möglich? Welche Veränderungen treten bei den Punktkoordinaten auf, wenn die Strecke a) waagrecht und b) senkrecht ist? 3. Die Steigung m soll aus zwei Punkten [A(-2/2); B(2/4)] der Strecke errechnet werden, der Y-Achsenabschnitt kann durch Einsetzen einer der gegebenen Punkte erarbeitet werden. Lösung Aufgabe 2: 1. Die Steigung m kann aus 2 Punkten der Strecke erarbeitet werden. Hier im Beispiel ist es von Vorteil die gegebenen Anfangs- und Endpunkt der Strecke zur Berechnung heranzuziehen. Sind die Punkte A(xa/ya) und B(xb/yb) verschieden und ist xa ≠ xb, dann gilt für die Steigung m der durch die o.g. Punkte festgelegten Gerade: 2. Die Strecke kann jegliche Lagen einnehmen: Lage der Strecke Koordinatenverhalten der Punkte a) waagrecht Die Y-Werte der Punkte sind gleich, die XWerte sind voneinander verschieden b) senkrecht Die X-Werte der Punkte sind gleich die YWerte sind voneinander verschieden 3. Unterschiede im Vorgehen: Beispiel: Die Steigung m wird wie folgt berechnet: y − ya 1 4−2 m= b = = xa − xb 2 − (−2) 2 Der Y-Achsenabschnitt ergibt sich wie folgt: 1 4= *2+n Æ n =3 2 Aufgabe 3: Im Computer kannst du mit Hilfe von Zeichenprogrammen beliebige Strecken zeichnen (lassen). Öffne nun MS Paint (Start/Alle Programme/Zubehör/Paint) und zeichne mit dem Werkzeug „Linien“ einige Strecken auf die Zeichenoberfläche. Benutze die Lupenfunktion . Beschreibe in eigenen Worten was dir beim Spiel mit der Lupe an Veränderungen auffällt. 3 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Lösung Aufgabe 3: Dir ist es bestimmt aufgefallen! Wenn du Linien in einem Zeichen- oder Malprogramm (hier: MS Paint) zeichnest, erscheint auf dem Bildschirm eine „exakte“ Linie - wenn du genau hinschaust erkennst du höchstens ein paar „Franzen“. Vergrößerst du aber die Strecken mit der Lupe, verlaufen die Linien nicht mehr „gerade“, sondern „steigen Treppen“. Diese Darstellung kommt durch den Bildschirm, ein sogenanntes Rasterdarstellungsgerät (weitere: Drucker, Fernseher) zustande. Das Display eines Bildschirmes ist aus quadratischen Pixel aufgebaut, du kannst dir den Bildschirm also als Karo-Papier vorstellen, wobei ein Karo einem Pixel entspricht. Pixels sind kleine Punkte, die wie beim Fernseher auch, von Elektronen angestrahlt werden können und dann in einer bestimmten Farbe aufleuchten. Die Anzahl der Pixel pro Bildschirm richtet sich nach der Auflösung. Hat ein Computerbildschirm eine Auflösung von 640 x 480 Pixel, dann stehen ihm 307 200 Pixels zur Verfügung, um z.B. eine Zeichnung darzustellen. Mit einer Auflösung von 1024 x 768 Pixel (786 432 Pixels) kann die gleiche Zeichnung natürlich genauer angegeben werden (vergleiche untenstehende Abbildungen). Nichts desto Trotz bleibt die Pixelanzahl der Bildschirmoberfläche endlich und die Linien werden nicht so gerade, wie wenn du eine Linie mit Bleistift und Lineal auf ein Blatt Papier zeichnest. • Beispiele für „Verfeinerung“ der Auflösung (Beispiel 1: Auflösung 20 * 16) (Beispiel 1: Auflösung 40 * 32) 4 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Aufgabe 4: Um den Unterschied einer Liniendarstellung im Heft und einem vergrößertem Monitorbild zu verdeutlichen, öffne die Datei „Strecke 04 Aufgabe.pdf“, drucke sie aus und versuche jeweils die gegebenen Punkte A und B durch eine Linie miteinander zu verbinden. Beachte dabei, dass dafür auf der rechten Blattseite nur die vorhandenen „Pixel“ genutzt werden können. Wähle die der eigentlichen Linie nächsten Kästchen, damit die Rasterlinie möglichst gleichförmig aussieht. Lösung Aufgabe 4: Du findest die Lösungen der Aufgabe 1 in der Datei „Strecke 04 Loesung.pdf“. Die Aufgabe, die du beim vorherigen Arbeitsblatt übernommen hast, nämlich das Auswählen des „richtigen Pixels“, bestreitet der Computer „automatisch“. Diese Berechnungen übernehmen heutige Grafikkarten mittels integrierter Algorithmen. Jack Bresenham entwickelte bereits 1965 hierzu einen Algorithmus, der diese Aufgabe effizient übernimmt. Graphische Darstellung von Strecken auf einem Pixelbildschirm mittels des Bresenham-Algorithmus Hierbei wird eine Linie vom Ursprung aus nach Punkt D( ∆ x| ∆ y) gezeichnet (D = B - A), d.h. der Ursprung wird an den Startpunkt der Gerade verschoben. Eine etwaige Verschiebung zu den tatsächlichen Koordinaten könnte daher erst bei der Ausgabe in einem neuen Diagramm erfolgen. Gegeben seien: • ∆ x > 0; • ∆ y > 0; • ∆ x > ∆ y (da der Bresenham-Algorithmus ohne Änderung nur im Bereich von 0-45° funktioniert) Aufgrund der obigen Einschränkungen (Bereich von 0-45°) wird genau ein Oktant des Koordinatensystems beschrieben, in dem die Linie gezeichnet werden kann. Hierbei werden alle x (von 0 bis ∆ x) durchlaufen, wobei für jedes x der entsprechende y-Wert ermittelt wird, der „Pixel“ wird in unserem Beispiel (Excel-Tabelle) mittels der bedingten Formatierung gesetzt. Als der anzuzeigende Punkt wird der gewählt, der näher an der wirklichen Linie liegt (Vergleich der beiden Werte anhand ihrer absoluten Beträge). Durch diesen Algorithmus wird demnach die Lage des nächsten Punktes berechnet, sofern es sich um eine ideale Linie handelt. Da der nächste Punkt entsprechend unseres „Pixel-Bildschirms“ nur an bestimmte Positionen gesetzt werden kann ergibt sich eine Abweichung, deren Größe entscheidet, ob für die nächste Koordinate der aktuelle y-Wert beibehalten werden kann, oder ob dieser um 1 erhöht werden muss. Wie zuvor erwähnt entwickelte Jack Bresenham einen solchen Algorithmus (1965), bei dem der jeweils nächsten Wert aus dem vorherigen berechnet wird und die Abweichung mitgeführt wird, um letztlich immer den Punkt zu wählen, der näher an der wirklichen Linie liegt. Vor allem die Schnelligkeit dieses Algorithmus sowie die überaus brauchbaren Ergebnisse stellen hierbei die Vorteile des Bresenham-Algorithmus dar. 5 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Gegeben seien hierzu zwei Punkte A(xa,ya) und B(xb,yb) sowie die allgemeine Geradengleichung ax + by + c = 0 , sodass folgende Bedingungen gelten: Geg.: Bresenham ( xa , ya , xb , yb ) A: A(xa,ya) B: B(xb,yb) m = ∈y/∈x = (yb-ya) / (xb-xa) a := −( yb − ya ) ; b := ( xb − xa ) x := xa ; y := ya ; d := 0 2 Entsprechend der allgemeinen Geradengleichung [y = m*x + n] folgt : y= m * x+ n 1 m a* x + b* y + c = 0 wobei gilt: x n x, y ∈ R a ² + b² ≠ 0 a ² + b ² = 1 (hessesche Normalform) 1 Normalenvektor (senkrecht auf der Strecke AB) B n = −( yb − ya ) /( xb − xa ) n Alternativ: allgemein: A (xa,ya) B (xb ,yb ) Normalenvektor: xa d: Pixelstrecke: AB A Vergleich des Abstandes zweier Punkte von der Geraden. 2 A xa a* x + b* y + c = 0 δx AB b a b a ( a ) = (-(yx -x-y )) n b B A= (xa,ya) δy B= (xb ,yb) m= ( xy -x-y ) b b a a δy yb - ya = δx xb - xa Da d durch den Koordinatenursprung verläuft, ist d zu Anfangs 0. Im ersten Fall ist somit für den Abstand (d) zu dem zu untersuchenden Punktes der Wert 0 zu wählen. folglich: a* x + b* y + c = d d =0 6 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Für den Punkt an der Stelle x+1 werden nun die Abstande d1 und d2 verglichen, wobei nun d1 der alte Abstand d + a ist. d1: Alter Punkt mit x+1 und y gleichbleibend d1 = a * ( x + 1) + b * y + c d1 = (ax + by + c) + a da bereits d1 = d + a d2: (ax + by + c) = d war folgt ... Bei dem Abstand d2 werden sowohl x+1 als auch y+1 gesetzt, so dass: d2 d2 d2 d2 = a ( x + 1) + b( y + 1) + c = ax + a + by + b + c = (ax + by + c + a ) + b = d1 + b (ax + by + c + a ) = d1 war folgt ... da bereits Prinzipieller Programmablauf (Anmerkung: folgender Programmablauf ist als Programmprinzip anzusehen, d.h. es handelt sich hierbei um keine spezielle Programmiersprache) Bresenham ( xa , ya , xb , yb ) a := −( yb − ya ) ; b := ( xb − xa ) ; [ c := − a * xa − b * ya ... wird nicht benötigt s.o] x := xa ; y := ya ; d := 0 Es soll nun solange x ≤ xb folgendes verglichen werden: ... wobei d1 := d + a ; d2 = d1 + b ... falls nun der Betrag ∗d2∗ < ∗d1∗ dann soll y = y + 1 sein und d wird d2 ... sonst soll d = d1 werden. SOLANGE (x ≤ xb ) {ZEICHNE (x,y) ; d1 := d + a } ; d 2 = d1 + b ; d 2 < d1 FALLS DANN { y = y + 1 ; d = d2 } ; SONST { d = d1 }; Übertragen in eine Excel-Tabelle xa ya 0 0 xb 9 willkürlich 5 willkürlich yb d d1 d2 y 1. Fall 2. Fall (...und weitetere...) 0 =Z(-1)S+a =Z(-1)S+b =ya =WENN(ABS(Z(2)S(-1)<ABS(Z(1)S(-1)));Z(2)S(-1);Z(1)S(-1)) =Z(-1)S+a =Z(-1)S+b =WENN(Z(-3)S=Z(-1)S(-1);ZS(-1)+1;ZS(-1)) a =-(yb-ya) b =xb-xa 7 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Beispiel einer Umsetzung mittels Excel: Aufgabe 5: Entsprechend den vorherigen Ausführungen (siehe Bresenham-Algorithmus / Alternativ) soll den Schülern die Vorgehensweise des Bresenham-Algorithmus erklärt werden. Die Schüler sollen anschließend die Datei „Strecke 05 Aufgabe.xls“ öffnen und mit folgenden Arbeitaufträgen bearbeiten: • Fülle die entsprechenden Zellen (a, b, d / d, d1, d2, y) mit den dazugehörigen Formeln aus (vgl. Bresenham-Algorithmus / Alternativ). • Stelle durch Verändern der Werte für ya und yb die folgenden Strecken dar: a) A(0/3); B(10/6) b) A(0/1); B(10/10) c) A(0/6); B(10/6) d) A(0/8); B(10/5) e) A(0/2); B(10/15) • Was fällt dir bei den letzten zwei Streckendarstellungen auf? Erläuterung: Der obige Algorithmus von Bresenham ist nur gültig für Winkel ≤ 45 Grad. Durch geeignete geometrische Operationen könnten die obigen Strecken in Geradenstücke mit 0<mAB<1 überführt werden. • Durch welche geeigneten geometrischen Operationen könnten die obigen Strecken in Geradenstücke mit 0<mAB<1 überführt werden? - Beschreibe jeweils einen Lösungsvorschlag. 8 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 Lösung 5: Siehe Datei „Strecke 05 Loesung.xls“ a) A(0/3); B(10/6) b) A(0/1); B(10/10) c) A(0/6); B(10/6) 9 Michael Frank und Heinz-Joachim Offenburger: „Der Bresenham–Algorithmus für Strecken“ Hausarbeit Fachwissenschaftliches Hauptseminar Computergrafik, Wintersemester 2003/2004 d) A(0/8); B(10/5) e) A(0/2); B(10/15) Durch geeignete Drehungen, Verschiebung bzw. Spiegelungen, wären diese Strecken darstellbar. Für die Strecke (d) A(0/8); B(10/5) stellt sich das Problem, dass eine „horizontale Linie“ dargestellt wird, da der BresenhamAlgorithmus in der vorliegenden Form nur für Strecken mit der Steigung 0<m<1 gültig ist. Daher wäre die Strecke z.B. A(0/8); B(10/5) darstellbar durch Spiegelung von A(0/8); B(10/11) an der X-Achse und Verschiebung. Die Strecke (e) A(0/2); B(10/15) wird ebenso fälschlich dargestellt, da wiederum die Einschränkung (Steigung 0<m<1) gilt – die tatsächliche Darstellung (s.o) wäre mit der Strecke A(0/2); B(10/12) vergleichbar (m=1). Darstellbar wäre die Strecke A(0/2); B(10/15) z.B. durch Spiegelung der Strecke A(0/2); B(13/12) an der um (0/2) verschobenen ersten Winkelhalbierenden. 10