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