Grafikmodus — Änderungen 11453 → 11457

Zeile 1: Zeile 1:
 +
{{Vorlage:Stub}}
 +
 
Auch wenn die meisten Hobby-[[Betriebssystem|Betriebssysteme]] "nur" über eine [[Command_Line_Interface|Kommandozeile]] verfügen, ist die Entwicklung einer [[GUI|grafischen Benutzeroberfläche]] ab einem gewissen Entwicklungsstand des Kernels auch ein interessantes Projekt.
 
Auch wenn die meisten Hobby-[[Betriebssystem|Betriebssysteme]] "nur" über eine [[Command_Line_Interface|Kommandozeile]] verfügen, ist die Entwicklung einer [[GUI|grafischen Benutzeroberfläche]] ab einem gewissen Entwicklungsstand des Kernels auch ein interessantes Projekt.
  
Zeile 5: Zeile 7:
  
 
== Voraussetzungen ==
 
== Voraussetzungen ==
−
Dieses Tutorial soll nicht erklären, wie man den Bildschirm ansteuert oder arithmetische Berechnungen durchführt. Aus diesem Grund werden auch Funktionen wie putpixel() (s.u.) oder sin() nicht genau erläutert, sondern nur die hier verwendete Signatur kurz erklärt. Die Funktionen sind auf das Nötigste beschränkt, weshalb die Beispiele für den praktischen Einsatz durchaus noch erweitert werden können (z.B. Farben bei putpixel() o.ä.).
+
Dieses Tutorial soll nicht erklären, wie man den Bildschirm ansteuert oder arithmetische Berechnungen durchführt. Aus diesem Grund werden auch Funktionen wie putpixel() (s.u.) oder sin() nicht genau erläutert, sondern nur die hier verwendete Signatur kurz erklärt. Die Funktionen sind auf das Nötigste beschränkt, weshalb die Beispiele für den praktischen Einsatz durchaus noch erweitert werden können (z.B. Farben bei <code>putpixel()</code> o.ä.).
  
−
Im Folgenden wird eine Funktion putpixel() verwendet, die folgendermaßen definiert ist:
+
Im Folgenden wird eine Funktion <code>putpixel()</code> verwendet, die folgendermaßen definiert ist:
  
−
<c>
+
<syntaxhighlight lang="c">
 
void putpixel(int x, int y);
 
void putpixel(int x, int y);
−
</c>
+
</syntaxhighlight>
  
 
Diese Funktion stellt nur das absolut notwendigste dar, und zwar geht sie von einem schwarzen Bildschirm aus und setzt beim Aufruf das Pixel an der angegebenen Koordinate auf weiß. Die Koordinaten sind, wie üblich, in Pixeln gezählt, wobei das Pixel in der linken oberen Ecke die Koordinaten (0|0) hat.
 
Diese Funktion stellt nur das absolut notwendigste dar, und zwar geht sie von einem schwarzen Bildschirm aus und setzt beim Aufruf das Pixel an der angegebenen Koordinate auf weiß. Die Koordinaten sind, wie üblich, in Pixeln gezählt, wobei das Pixel in der linken oberen Ecke die Koordinaten (0|0) hat.
Zeile 17: Zeile 19:
 
Eine weitere Funktion heißt round():
 
Eine weitere Funktion heißt round():
  
−
<c>
+
<syntaxhighlight lang="c">
−
unsigned int round(unsigned double number); //Rundet die Zahl, z.B. round(4.2) = 4 und round(5.7) = 6
+
unsigned int round(unsigned double number); // Rundet die Zahl, z.B. round(4.2) = 4 und round(5.7) = 6
−
</c>
+
</syntaxhighlight>
  
  
Zeile 25: Zeile 27:
 
Wir beginnen mit dem Zeichnen von einfachen Linien. Gerade Linien zu zeichnen, ist nicht das Problem - bei schiefen wird es dagegen schwieriger. Wir beschränken uns auf den letzteren Fall, da der Algorithmus universell einsetzbar sein soll.
 
Wir beginnen mit dem Zeichnen von einfachen Linien. Gerade Linien zu zeichnen, ist nicht das Problem - bei schiefen wird es dagegen schwieriger. Wir beschränken uns auf den letzteren Fall, da der Algorithmus universell einsetzbar sein soll.
  
−
Für das Zeichnen von Linien benötigt man das Wissen über lineare Funktionen aus der Schule. Der Bresenham-Algorithmus basiert auf genau diesem Prinzip. Und zwar: Es gibt zwei Punkte P(x1|y1) und Q(x2|y2), zwischen denen die Linie verlaufen soll. Dazu denken wir uns ein Koordinatensystem, bei dem die x-Achse nach rechts und die y-Achse nach unten verläuft (Ursprung links oben).
+
Für das Zeichnen von Linien benötigt man das Wissen über lineare Funktionen aus der Schule. Der Bresenham-Algorithmus basiert auf genau diesem Prinzip. Und zwar: Es gibt zwei Punkte <code>P(x1|y1)</code> und <code>Q(x2|y2)</code>, zwischen denen die Linie verlaufen soll. Dazu denken wir uns ein Koordinatensystem, bei dem die x-Achse nach rechts und die y-Achse nach unten verläuft (Ursprung links oben).
  
 
Zur Erinnerung hier noch einmal die Grundform einer linearen Funktion:
 
Zur Erinnerung hier noch einmal die Grundform einer linearen Funktion:
Zeile 31: Zeile 33:
 
f(x) = mx + t
 
f(x) = mx + t
 
</code>
 
</code>
−
Hier ist m die Steigung und t der y-Achsenabschnitt oder Offset.
+
Hier ist <code>m</code> die Steigung und <code>t</code> der y-Achsenabschnitt oder Offset.
  
−
t ist sehr einfach zu "berechnen": t = y1, da die Linie hier anfängt.
+
<code>t</code> ist sehr einfach zu "berechnen": <code>t = y1</code>, da die Linie hier anfängt.
  
−
m bekommt man mit der Formel m = (x2 - x1) / (y2 - y1).
+
<code>m</code> bekommt man mit der Formel <code>m = (x2 - x1) / (y2 - y1)</code>.
  
 
Nun kann man das ganze zu einer Funktion zusammensetzen:
 
Nun kann man das ganze zu einer Funktion zusammensetzen:
  
−
<c>
+
<syntaxhighlight lang="c">
 
void linie(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
 
void linie(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
 
{
 
{
Zeile 47: Zeile 49:
 
         putpixel(x, y1 + round(m * (double) x));
 
         putpixel(x, y1 + round(m * (double) x));
 
}
 
}
−
</c>
+
</syntaxhighlight>