Wie ein Computer eine Linie zeichnet
Computergrafik zeichnet Bilder aus Pixeln, kleinen Bildpunkten in einem Raster, und jedes Pixel trägt eine Farbe. Eine Linie auf dem Bildschirm ist nur eine Auswahl von Pixeln, die ein Programm der Reihe nach einschaltet.
Wer das versteht, kann Linien, Flächen und später ganze Szenen selbst berechnen. Das üben Sie in diesem Modul mit Python, ohne Zeichenprogramm.
Am Ende dieser Lektion
Notiz
Ich kann Pixel auf einem Raster ansprechen und eine Linie Schritt für Schritt zeichnen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Pixel | ein Bildpunkt mit einer Farbe | |
| Raster | alle Pixel in Zeilen und Spalten | |
| Koordinaten | zwei Zahlen, die ein Pixel benennen | (3, 2) |
| Steigung | wie viele Zeilen die Linie je Spalte steigt | |
| Rasterung | eine Form in Pixel umsetzen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jedes Pixel hat zwei Koordinaten
Ein Pixel wird durch zwei Zahlen benannt: x ist die Spalte und zählt nach rechts, y ist die Zeile und zählt nach unten. Gezählt wird ab null.
Das Pixel (0, 0) liegt also oben links. Bei einem Bild mit 4 Spalten und 3 Zeilen liegt das Pixel unten rechts bei (3, 2).
Beispiel: Bild mit 4 Spalten, 3 Zeilen
| Pixel | Spalte x | Zeile y | Lage |
|---|---|---|---|
| (0, 0) | 0 | 0 | oben links |
| (3, 0) | 3 | 0 | oben rechts |
| (0, 2) | 0 | 2 | unten links |
| (3, 2) | 3 | 2 | unten rechts |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Das Lab zeichnet eine Linie in eine Datei
Der Befehl legt ein schwarzes Bild mit 16 Spalten und 8 Zeilen an und zeichnet eine weiße Linie von (1, 1) nach (14, 6). Er speichert das Bild als linie.png und liest drei Pixel zurück.
Er gibt (16, 8) 255 255 0 aus: die Größe, dann Weiß am Anfang, Weiß am Ende und Schwarz bei (1, 6), weit unter der Linie. Die Datei öffnen Sie danach in JupyterLab.
Eine Linie in linie.png zeichnen
docker exec jupyter python3 -c "from PIL import Image, ImageDraw; b = Image.new('L', (16, 8), 0); d = ImageDraw.Draw(b); d.line([(1, 1), (14, 6)], fill=255); b.save('linie.png'); print(b.size, b.getpixel((1, 1)), b.getpixel((14, 6)), b.getpixel((1, 6)))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die weißen Pixel der Linie zählen
docker exec jupyter python3 -c "from PIL import Image; b = Image.open('linie.png'); print(sum(1 for p in b.getdata() if p == 255))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Linie wählt für jede Spalte eine Zeile
Eine flache Linie läuft von links nach rechts. Für jede Spalte x rechnet das Programm aus, in welcher Zeile y die Linie dort liegt. Es rundet auf eine ganze Zahl, denn Pixel haben nur ganze Koordinaten.
Dazu braucht es zwei Unterschiede: dx, die Breite von Anfang bis Ende, und dy, die Höhe. Die Linie steigt je Spalte um dy geteilt durch dx Zeilen.
Beispiel: Linie von (1, 1) nach (14, 6)
| Spalte x | Schritte seit x0 | y genau | y gerundet |
|---|---|---|---|
| 1 | 0 | 1,00 | 1 |
| 2 | 1 | 1,38 | 1 |
| 3 | 2 | 1,77 | 2 |
| 5 | 4 | 2,54 | 3 |
| 8 | 7 | 3,69 | 4 |
| 14 | 13 | 6,00 | 6 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Linie Spalte für Spalte berechnen
# Die Linie von (0, 0) nach (8, 3), Spalte für Spalte.
x0 = 0
y0 = 0
x1 = 8
y1 = 3
dx = x1 - x0
dy = y1 - y0
for x in range(x0, x1 + 1):
y = y0 + (2 * dy * (x - x0) + dx) // (2 * dx)
print("Spalte", x, "Zeile", y)
# Ändern Sie y1 auf 8 und starten Sie erneut: Die Linie wird diagonal.
Die Pixel der Linie als Buchstaben ansehen
Der nächste Befehl druckt das Bild als Text: # für ein weißes Pixel, . für ein schwarzes. Das sind 8 Zeilen mit je 16 Zeichen.
Die Zeichen # wandern von oben links nach unten rechts, je Zeile zwei bis drei nebeneinander. Das Bild hat 14 weiße Pixel, eines je Spalte von 1 bis 14.
Das Bild als Buchstaben drucken
docker exec jupyter python3 -c "from PIL import Image; b = Image.open('linie.png'); print('\n'.join(''.join('#' if b.getpixel((x, y)) else '.' for x in range(16)) for y in range(8)))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, y wachse nach oben, wie im Koordinatensystem aus dem Mathematikunterricht. In einem Bild zählt y aber von der obersten Zeile nach unten. Eine Linie, die auf dem Bildschirm steigt, hat darum ein kleiner werdendes y.