Bresenham-Algorithmus (in Arbeit): Unterschied zwischen den Versionen
(→Effektivität des Algorithmus) |
(→Algorithmus für Gerade mit der Steigung m <= 1) |
||
Zeile 97: | Zeile 97: | ||
Wir geben den Startpunkt der Geraden auf unserem Plotter die Koordinaten (0,0), d.h. jede Gerade, die wir zeichnen erhält damit ein eigenes Koordinatensystem. | Wir geben den Startpunkt der Geraden auf unserem Plotter die Koordinaten (0,0), d.h. jede Gerade, die wir zeichnen erhält damit ein eigenes Koordinatensystem. | ||
Den ersten Punkt den wir zeichnen ist natürlich der Punkt <math>O (0,0)</math>, denn dies haben wir so festgelegt. Nun müssen wir für den nächsten Punkt entscheiden, ob wir nur ein Pixel (allgemein: einen Plotterschritt) nach rechts zum Punkt <math> T </math> gehen oder ein Pixel nach rechts und nach oben zum Punkt <math> S </math>. Um dies zu entscheiden müssen wir die Abstände, die die jeweiligen Punkte zu der idealen Geraden haben, vergleichen. Der Punkt mit dem kleineren Abstand wird dann angesteuert.<br> | Den ersten Punkt den wir zeichnen ist natürlich der Punkt <math>O (0,0)</math>, denn dies haben wir so festgelegt. Nun müssen wir für den nächsten Punkt entscheiden, ob wir nur ein Pixel (allgemein: einen Plotterschritt) nach rechts zum Punkt <math> T </math> gehen oder ein Pixel nach rechts und nach oben zum Punkt <math> S </math>. Um dies zu entscheiden müssen wir die Abstände, die die jeweiligen Punkte zu der idealen Geraden haben, vergleichen. Der Punkt mit dem kleineren Abstand wird dann angesteuert.<br> | ||
− | Hierfür betrachten wir die Differenz der Abstände <math> | | + | Hierfür betrachten wir die Differenz der Abstände <math> |d_t|-|d_s|</math>.<br> |
− | Nun gehen wir nicht mehr von dem ersten Punkt (Ursprung) <math> O </math> aus, sondern von einem allgemeinen Punkt <math> P = \begin{pmatrix} p_x \\ p_y \end{pmatrix} </math>, dementsprechend lautet dann der Punkt | + | |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Nun gehen wir nicht mehr von dem ersten Punkt (Ursprung) <math> O= \begin{pmatrix} 0 \\ 0 \end{pmatrix} </math> aus, sondern von einem allgemeinen Punkt <math> P = \begin{pmatrix} p_x \\ p_y \end{pmatrix} </math>, dementsprechend lautet dann der Punkt | ||
<math> T = \begin{pmatrix} p_x + 1 \\ p_y \end{pmatrix} </math> und der Punkt <math> S = \begin{pmatrix} p_x + 1 \\ p_y + 1 \end{pmatrix} </math> | <math> T = \begin{pmatrix} p_x + 1 \\ p_y \end{pmatrix} </math> und der Punkt <math> S = \begin{pmatrix} p_x + 1 \\ p_y + 1 \end{pmatrix} </math> | ||
− | <ggb_applet width="1260" height="880" version="4.2" ggbBase64=" | + | <ggb_applet width="1260" height="880" version="4.2" ggbBase64="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" showResetIcon = "false" enableRightClick = "false" errorDialogsActive = "true" enableLabelDrags = "false" showMenuBar = "false" showToolBar = "false" showToolBarHelp = "false" showAlgebraInput = "false" useBrowserForJS = "true" allowRescaling = "true" /> |
Zeile 108: | Zeile 117: | ||
− | + | '''Achtung:'''<br> | |
− | Wie wir unter dem Punkt Hesseform gesehen haben, kommt es bei | + | Wie wir unter dem Punkt Hesseform gesehen haben, kommt es bei dem Vorzeichen der Abständen der Punkte auf die Lage der Punkte im Bezug zur Geraden und dem Ursprung an. Da der Punkt <math> S </math> nicht zwischen Gerade und Ursprung liegt hat, ist der Abstand <math> d_s </math> positiv, analog ist der Abstand <math> d_t </math> negativ.<br><br> |
− | Also folgt mit | + | Also folgt mit:<br> |
<math>|t| - |s| = -t - s = - (t+s) </math><br><br> | <math>|t| - |s| = -t - s = - (t+s) </math><br><br> |
Version vom 8. März 2013, 12:58 Uhr
Inhaltsverzeichnis |
Allgemeines zum Bresenham Algorithmus
Motivation des Algorithmus
Der Bresenham Algorihtmus, ist ein Verfahren um Geraden möglichst "gut" auf Anzeigegeräten zu zeichnen. Hier heisst "gut", dass die Abweichung zwischen dem gezeichneten und dem gedachten Objekt möglichst gering ist.
Das Problem beim Darstellen einer Strecke auf einem Anzeigegerät ist, dass das erzeugte Bild nur durch endlich viele Punkte aufgebaut ist, dadurch entstehen "Lücken" beim zeichnen. Da unser Auge nur eine endliche Auflösung verarbeiten kann, scheint uns ein Bild auf dem Monitor nicht durch einzelne Punkte aufgebaut zu sein, sondern es entstehen für uns geometrische Formen, die wir mit unserer Vorstellung von mathematischen Objekten in Einklang bringen können.
Eine Gerade wie wir sie auf dem Bildschirm wahrnehmen.
Hier sieht man dieselbe Gerade um das Achtfache vergrößert.
Effektivität des Algorithmus
Dieser Algorithmus ist auch in heutiger Zeit in seiner Geschwindigkeit und Einfachheit ungeschlagen, da die Rechenoperationen sich auf Addition und die Multiplikation mit der Zwei beschränken lässt. Dadurch kann dieser Rechenalgorithmus direkt in die Hardware der Grafikkarten implementiert werden.
Potenzen:
Obwohl in den Rechentermen Potenzen auftreten, kann man diese umgehen.
Hierfür betrachten wir den Ausdruck:
die zweite Binomische Formel liefert:
durch rekursives Anwenden dieser Formel lassen sich Potenzen solange vereinfachen bis die Basis Eins erreicht ist und damit die Potenz verschwindet.
Multiplikation mit Zwei:
Eine Multiplikation mit Zwei ist für einen Computer eine elementare Rechenoperation, da die sogenannte Shift Operation (Verrückungsoperation) durchgeführt werden kann.
Wir erinnern uns an die Darstellung von Zahlen im Binärsystem.
Wertigkeit der Stelle | 2^7 = 128 | 2^6 = 64 | 2^5 = 32 | 2^4 = 16 | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 2^0 = 1 |
---|---|---|---|---|---|---|---|---|
Binärzahl | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
Hier wird die Zahl (im Dezimalsystem) dargestellt
Multiplizerien wir nun mit zwei, so folgt:
Also die Zahl 154 (Dezimal) in Binärdarstellung:
Wertigkeit der Stelle | 2^7 = 128 | 2^6 = 64 | 2^5 = 32 | 2^4 = 16 | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 2^0 = 1 |
---|---|---|---|---|---|---|---|---|
Binärzahl | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
Vergleichen wir nun die Darstellung der Zahl 77 mit der Darstellung der Zahl 154, so fällt auf, dass durch die Multiplikation mit Zwei jedes Bit um eine Stelle nach links verschoben wurde.
Bresenham-Algortihmus für Geraden
Algorithmus für Gerade mit der Steigung m <= 1
Wir wollen uns nun mit der folgenden Problemstellung beschäftigen, wir wollen eine Gerade, welche in Hesseform gegeben ist, mit einem Plotter (z.B. Monitor) zeichnen lassen. Wir wollen für den ersten Teil nur Geraden mit einer Steigung betrachten.
Sei die Gerade gegeben. Hierbei ist der normierte Normalenvektor, ein gegebener Ortsvektor eines Punktes der Geraden.
Wir geben den Startpunkt der Geraden auf unserem Plotter die Koordinaten (0,0), d.h. jede Gerade, die wir zeichnen erhält damit ein eigenes Koordinatensystem.
Den ersten Punkt den wir zeichnen ist natürlich der Punkt , denn dies haben wir so festgelegt. Nun müssen wir für den nächsten Punkt entscheiden, ob wir nur ein Pixel (allgemein: einen Plotterschritt) nach rechts zum Punkt gehen oder ein Pixel nach rechts und nach oben zum Punkt . Um dies zu entscheiden müssen wir die Abstände, die die jeweiligen Punkte zu der idealen Geraden haben, vergleichen. Der Punkt mit dem kleineren Abstand wird dann angesteuert.
Hierfür betrachten wir die Differenz der Abstände .
Nun gehen wir nicht mehr von dem ersten Punkt (Ursprung) aus, sondern von einem allgemeinen Punkt , dementsprechend lautet dann der Punkt und der Punkt
Achtung:
Wie wir unter dem Punkt Hesseform gesehen haben, kommt es bei dem Vorzeichen der Abständen der Punkte auf die Lage der Punkte im Bezug zur Geraden und dem Ursprung an. Da der Punkt nicht zwischen Gerade und Ursprung liegt hat, ist der Abstand positiv, analog ist der Abstand negativ.
Also folgt mit:
Nun entscheidet das Vorzeichen von welcher Punkt angesteuert wird:
Für der Punkt
Für der Punkt
Algorithmus für Gerade mit der Steigung m > 1
Wir wollen nun den Fall für Geraden betrachten deren Steigung größer ist als Eins. Ist dieser Fall nun auch betrachtet, steht uns der Algorithmus für alle Geraden zur Verfügung.
Die Vorausetzungen seien wie in dem Fall für die Steigung kleiner Eins.