Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:rgbwuerfel-und-sierpinski-farbig [2022/03/23 11:47] – [Code 4: Vorlage für farbiges Sierpinski-Dreieck samt SVG-Ausgabe] Olaf Schnürer | lehrkraefte:snr:informatik:rgbwuerfel-und-sierpinski-farbig [2022/03/27 18:44] (current) – [Einige Lösungsvorschläge] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Mit Python Bild-Dateien erzeugen: RGB-Würfel (als ppm) und farbiges Sierpinski-Dreieck (als SVG) ====== | ||
| + | |||
| + | Ziel heute: Die folgenden Grafiken mit Tigerjython erstellen! | ||
| + | |||
| + | ===== RGB-Farbwürfel ===== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | und hier als png: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== RGB-Farb-Sierpinski-Dreieck ===== | ||
| + | |||
| + | ((Weiss ist hier und im nächsten Dreieck nicht genau im Schwerpunkt des 2-Simplex, damit relativ komplizierte Umrechnungen nicht zusätzliche Schwierigkeiten bereiten.)) | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | und hier als png: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== RGB-Farbdreieck ===== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | und hier als png... | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ====== Vorlagen für die Lektion ====== | ||
| + | |||
| + | ==== Code 1: Vorlage für RGB-Farbwürfel ==== | ||
| + | |||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | makeGPanel(Size(382, | ||
| + | window(-127, | ||
| + | |||
| + | # Code zu ergänzen: Male Farbwürfel Pixel für Pixel | ||
| + | |||
| + | # auf Schulcomputer funktioniert: | ||
| + | ausgabe = open(" | ||
| + | |||
| + | # unter Linux (und vermutlich auch macOS) funktioniert z.B. | ||
| + | # ausgabe = open(" | ||
| + | |||
| + | ausgabe.write(" | ||
| + | ausgabe.write(" | ||
| + | ausgabe.write(" | ||
| + | |||
| + | # Code zu ergänzen: Speichere weiter oben Farbinformation in Liste und schreibe sie nun hier in die ppm-Datei. | ||
| + | |||
| + | ausgabe.close() | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | |||
| + | ==== Code 2: Vorlage: Auf dem Weg zum rekursiv programmierten Sierpinski-Dreieck (Einführung in Rekursion) ==== | ||
| + | |||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | def dreieck_4(x1, | ||
| + | fillTriangle(x1, | ||
| + | |||
| + | def dreieck_3(x1, | ||
| + | | ||
| + | print(" | ||
| + | # Code zu ergänzen | ||
| + | |||
| + | def dreieck_2(x1, | ||
| + | |||
| + | print(" | ||
| + | # Code zu ergänzen | ||
| + | |||
| + | def dreieck_1(x1, | ||
| + | |||
| + | print(" | ||
| + | # Code zu ergänzen | ||
| + | |||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | Px, Py = 0, 0 | ||
| + | Qx, Qy = 255, 0 | ||
| + | Rx, Ry = 128, 222 | ||
| + | |||
| + | dreieck_4(Px, | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Code 3: Vorlage für RGB-Farbdreieck bzw. zuerst RGB-Farbrechteck ==== | ||
| + | |||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | def berechneRGB(x, | ||
| + | | ||
| + | # Code zu ergaenzen: RGB-Farbwerte zu gegebener Position (x,y) | ||
| + | | ||
| + | return int(rot), int(blau), int(gruen) | ||
| + | |||
| + | | ||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | # Code zu ergaenzen: Male RGB-Farbrechteck | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | |||
| + | ==== Einfache SVG-Beispieldatei ==== | ||
| + | |||
| + | <code html> | ||
| + | <svg height=' | ||
| + | <rect width=' | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Code 4: Vorlage für farbiges Sierpinski-Dreieck samt SVG-Ausgabe ==== | ||
| + | |||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | MAX_TIEFE = 3 | ||
| + | # Tiefe 12 schafft Inkscape noch mit Mühe, ab 13 weigert es sich | ||
| + | # Tiefe 8 für dokuwiki svg | ||
| + | |||
| + | def berechneRGB(x, | ||
| + | # Farbverteilung auf Dreieck nicht ideal, aber gut genug. | ||
| + | rot = (255 - y) / 255 * (255 - x) | ||
| + | gruen = (255 - y) / 255 * x | ||
| + | blau = y | ||
| + | maximum = max(rot, blau, gruen) | ||
| + | rot = rot / maximum * 255 | ||
| + | blau = blau / maximum * 255 | ||
| + | gruen = gruen / maximum * 255 | ||
| + | | ||
| + | return int(rot), int(blau), int(gruen) | ||
| + | | ||
| + | def sierpinskiDreieck(x1, | ||
| + | if tiefe == MAX_TIEFE: | ||
| + | |||
| + | # Code zu ergänzen: Auswahl der richtigen Farbe. | ||
| + | | ||
| + | fillTriangle(x1, | ||
| + | | ||
| + | # Code zu ergänzen: Ausgabe des Dreiecks in SVG-Datei | ||
| + | | ||
| + | else: | ||
| + | a12 = (x1 + x2) / 2 | ||
| + | b12 = (y1 + y2) / 2 | ||
| + | a13 = (x1 + x3) / 2 | ||
| + | b13 = (y1 + y3) / 2 | ||
| + | a23 = (x2 + x3) / 2 | ||
| + | b23 = (y2 + y3) / 2 | ||
| + | | ||
| + | sierpinskiDreieck(x1, | ||
| + | sierpinskiDreieck(a12, | ||
| + | sierpinskiDreieck(a13, | ||
| + | # Folgende Zeile auskommentieren, | ||
| + | # sierpinskiDreieck(a12, | ||
| + | |||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | Px, Py = 0, 0 | ||
| + | Qx, Qy = 255, 0 | ||
| + | Rx, Ry = 128, 222 | ||
| + | |||
| + | # auf Schulcomputern mit Windows funktioniert: | ||
| + | ausgabe = open(" | ||
| + | |||
| + | # Unter Linux (und wohl auch macOS): | ||
| + | # ausgabe = open(" | ||
| + | |||
| + | ausgabe.write("< | ||
| + | ausgabe.write("< | ||
| + | |||
| + | sierpinskiDreieck(Px, | ||
| + | |||
| + | ausgabe.write("</ | ||
| + | ausgabe.close() | ||
| + | |||
| + | print(" | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | |||
| + | ====== Einige Lösungsvorschläge ====== | ||
| + | <hidden Farbwürfel, | ||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | makeGPanel(Size(382, | ||
| + | window(-127, | ||
| + | |||
| + | rgbWert = [[[255, 255, 255] for y in range(256 + 127)] for x in range(256 + 127)] | ||
| + | |||
| + | for b in range(0, 256): | ||
| + | for r in range(0, 256): | ||
| + | for g in range(0, 256): | ||
| + | if r == 255 or g == 255 or b == 255: | ||
| + | farbe = makeColor(r, | ||
| + | setColor(farbe) | ||
| + | x = r - 0.5 * b | ||
| + | y = g - 0.5 * b | ||
| + | | ||
| + | point(x, y) | ||
| + | | ||
| + | rgbWert[int(x) + 127][int(y) + 127] = [r, g, b] | ||
| + | |||
| + | print(" | ||
| + | |||
| + | ausgabe = open(" | ||
| + | # ausgabe = open(" | ||
| + | ausgabe.write(" | ||
| + | ausgabe.write(" | ||
| + | ausgabe.write(" | ||
| + | |||
| + | for y in range(255 + 127, -1, -1): | ||
| + | for x in range(256 + 127): | ||
| + | ausgabe.write(str(rgbWert[x][y][0]) + " "\ | ||
| + | + str(rgbWert[x][y][1]) + " "\ | ||
| + | + str(rgbWert[x][y][2]) + " | ||
| + | |||
| + | print(" | ||
| + | ausgabe.close() | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Sierpinski-Dreieck rekursiv> | ||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | # Bitte erhöhen, aber nicht viel grösser als 12 gehen. | ||
| + | MAX_TIEFE = 2 | ||
| + | pausenZeit = 100 | ||
| + | |||
| + | def sierpinskiDreieck(x1, | ||
| + | if tiefe == MAX_TIEFE: | ||
| + | fillTriangle(x1, | ||
| + | | ||
| + | # Damit auch etwas gezeichnet wird, wenn die Dreiecke | ||
| + | # "zu klein" sind. | ||
| + | if MAX_TIEFE > 7: | ||
| + | point(int(x1), | ||
| + | | ||
| + | delay(pausenZeit) | ||
| + | else: | ||
| + | a12 = (x1 + x2) / 2 | ||
| + | b12 = (y1 + y2) / 2 | ||
| + | a13 = (x1 + x3) / 2 | ||
| + | b13 = (y1 + y3) / 2 | ||
| + | a23 = (x2 + x3) / 2 | ||
| + | b23 = (y2 + y3) / 2 | ||
| + | | ||
| + | sierpinskiDreieck(x1, | ||
| + | sierpinskiDreieck(a12, | ||
| + | sierpinskiDreieck(a13, | ||
| + | |||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | Px, Py = 0, 0 | ||
| + | Qx, Qy = 255, 0 | ||
| + | Rx, Ry = 128, 222 | ||
| + | |||
| + | sierpinskiDreieck(Px, | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Farbdreieck> | ||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | def berechneRGB(x, | ||
| + | # Farbverteilung auf Dreieck nicht ideal, aber gut genug. | ||
| + | rot = (255 - y) / 255 * (255 - x) | ||
| + | gruen = (255 - y) / 255 * x | ||
| + | blau = y | ||
| + | |||
| + | maximum = max(rot, blau, gruen) | ||
| + | rot = rot / maximum * 255 | ||
| + | blau = blau / maximum * 255 | ||
| + | gruen = gruen / maximum * 255 | ||
| + | | ||
| + | return int(rot), int(blau), int(gruen) | ||
| + | |||
| + | | ||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | for x in range(256): | ||
| + | for y in range(222): | ||
| + | r, g, b = berechneRGB(x, | ||
| + | # print(r, g, b) | ||
| + | farbe = makeColor(r, | ||
| + | setColor(farbe) | ||
| + | point(x, y) | ||
| + | |||
| + | delay(1000) | ||
| + | setColor(" | ||
| + | triangle(0, 0, 255, 0, 128, 222) | ||
| + | |||
| + | delay(1000) | ||
| + | setColor(" | ||
| + | fillTriangle(0, | ||
| + | fillTriangle(256, | ||
| + | |||
| + | delay(5000) | ||
| + | dispose() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Farbiges Sierpinski-Dreieck, | ||
| + | <code python> | ||
| + | from gpanel import * | ||
| + | |||
| + | MAX_TIEFE = 7 | ||
| + | # Tiefe 12 schafft Inkscape noch mit Mühe, ab 13 weigert es sich | ||
| + | # Tiefe 8 für dokuwiki svg | ||
| + | |||
| + | def berechneRGB(x, | ||
| + | # Farbverteilung auf Dreieck nicht ideal, aber gut genug. | ||
| + | rot = (255 - y) / 255 * (255 - x) | ||
| + | gruen = (255 - y) / 255 * x | ||
| + | blau = y | ||
| + | maximum = max(rot, blau, gruen) | ||
| + | rot = rot / maximum * 255 | ||
| + | blau = blau / maximum * 255 | ||
| + | gruen = gruen / maximum * 255 | ||
| + | | ||
| + | return int(rot), int(blau), int(gruen) | ||
| + | |||
| + | def hexadezimalZweistellig(zahl): | ||
| + | s = hex(zahl)[2: | ||
| + | if len(s) < 2: | ||
| + | s = " | ||
| + | return s | ||
| + | | ||
| + | def sierpinskiDreieck(x1, | ||
| + | if tiefe == MAX_TIEFE: | ||
| + | r, g, b = berechneRGB((x1+x2+x3)/ | ||
| + | farbe = makeColor(r, | ||
| + | setColor(farbe) | ||
| + | fillTriangle(x1, | ||
| + | | ||
| + | # Damit auch etwas gezeichnet wird, wenn die Dreiecke | ||
| + | # "zu klein" sind. | ||
| + | if MAX_TIEFE > 7: | ||
| + | point(int(x1), | ||
| + | | ||
| + | ausgabe.write("< | ||
| + | + str(x1) + ", " + str(222-y1) + " " | ||
| + | + str(x2) + ", " + str(222-y2) + " " | ||
| + | + str(x3) + ", " + str(222-y3) + " " | ||
| + | + " ' style=' | ||
| + | + hexadezimalZweistellig(r) | ||
| + | + hexadezimalZweistellig(g) | ||
| + | + hexadezimalZweistellig(b) | ||
| + | + "'/> | ||
| + | else: | ||
| + | a12 = (x1 + x2) / 2 | ||
| + | b12 = (y1 + y2) / 2 | ||
| + | a13 = (x1 + x3) / 2 | ||
| + | b13 = (y1 + y3) / 2 | ||
| + | a23 = (x2 + x3) / 2 | ||
| + | b23 = (y2 + y3) / 2 | ||
| + | | ||
| + | sierpinskiDreieck(x1, | ||
| + | sierpinskiDreieck(a12, | ||
| + | sierpinskiDreieck(a13, | ||
| + | # Folgende Zeile auskommentieren, | ||
| + | # sierpinskiDreieck(a12, | ||
| + | |||
| + | makeGPanel(Size(255, | ||
| + | window(0, 255, 0, 222) | ||
| + | |||
| + | Px, Py = 0, 0 | ||
| + | Qx, Qy = 255, 0 | ||
| + | Rx, Ry = 128, 222 | ||
| + | |||
| + | ausgabe = open(" | ||
| + | |||
| + | # ausgabe = open(" | ||
| + | # Wenn man auf Dateien in einem anderen Verzeichnis zugreifen will, | ||
| + | # muss man unter Windows den Pfad sinngemaess wie folgt angeben. | ||
| + | # ausgabe = open(" | ||
| + | |||
| + | ausgabe.write("< | ||
| + | ausgabe.write("< | ||
| + | |||
| + | sierpinskiDreieck(Px, | ||
| + | |||
| + | ausgabe.write("</ | ||
| + | ausgabe.close() | ||
| + | |||
| + | print(" | ||
| + | |||
| + | delay(2000) | ||
| + | dispose() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||