~~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 =====
{{ :lehrkraefte:snr:informatik:rgb-color-cube.ppm.txt |ppm-Datei für RGB-Farbwürfel als .txt}} (Da ich hier im dokuwiki keine SVG-Dateien hochladen konnte.)
und hier als png:
{{:lehrkraefte:snr:informatik:rgb-color-cube.png?800|}}
===== 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.))
{{ :lehrkraefte:snr:informatik:sierpinski-fuer-dokuwiki.svg.txt | SVG-Datei für RGB-Farb-Sierpinski-Dreieck als .txt}}
und hier als png:
{{:lehrkraefte:snr:informatik:sierpinski-fuer-dokuwiki.png?800|}}
===== RGB-Farbdreieck =====
{{ :lehrkraefte:snr:informatik:sierpinski-farbdreieck-ausgefuellt-fuer-dokuwiki.svg.txt |SVG-Datei für RGB-Farbdreick als .txt}}
und hier als png...
{{:lehrkraefte:snr:informatik:sierpinski-farbdreieck-ausgefuellt-fuer-dokuwiki.png?800|}}
====== Vorlagen für die Lektion ======
==== Code 1: Vorlage für RGB-Farbwürfel ====
from gpanel import *
makeGPanel(Size(382, 382))
window(-127, 255, -127, 255)
# Code zu ergänzen: Male Farbwürfel Pixel für Pixel
# auf Schulcomputer funktioniert:
ausgabe = open("C:\\Users\\kleingeschreibenerVorname.kleingeschriebenerNachname\\RGB-farbwuerfel.ppm", "w")
# unter Linux (und vermutlich auch macOS) funktioniert z.B.
# ausgabe = open("RGB-color-cube.ppm", "w")
ausgabe.write("P3\n")
ausgabe.write("383 383\n")
ausgabe.write("255\n")
# 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) ====
from gpanel import *
def dreieck_4(x1, y1, x2, y2, x3, y3):
fillTriangle(x1, y1, x2, y2, x3, y3)
def dreieck_3(x1, y1, x2, y2, x3, y3):
print("Code zu ergänzen!")
# Code zu ergänzen
def dreieck_2(x1, y1, x2, y2, x3, y3):
print("Code zu ergänzen!")
# Code zu ergänzen
def dreieck_1(x1, y1, x2, y2, x3, y3):
print("Code zu ergänzen!")
# Code zu ergänzen
makeGPanel(Size(255, 222))
window(0, 255, 0, 222)
Px, Py = 0, 0
Qx, Qy = 255, 0
Rx, Ry = 128, 222
dreieck_4(Px, Py, Qx, Qy, Rx, Ry)
delay(2000)
dispose()
==== Code 3: Vorlage für RGB-Farbdreieck bzw. zuerst RGB-Farbrechteck ====
from gpanel import *
def berechneRGB(x, y):
# Code zu ergaenzen: RGB-Farbwerte zu gegebener Position (x,y)
return int(rot), int(blau), int(gruen)
makeGPanel(Size(255, 222))
window(0, 255, 0, 222)
# Code zu ergaenzen: Male RGB-Farbrechteck
#delay(1000)
#setColor("black")
#triangle(0, 0, 255, 0, 128, 222)
#delay(1000)
#setColor("white")
#fillTriangle(0, 0, 128, 222, 0, 222)
#fillTriangle(256, 0, 256, 222, 128, 222)
delay(2000)
dispose()
==== Einfache SVG-Beispieldatei ====
==== Code 4: Vorlage für farbiges Sierpinski-Dreieck samt SVG-Ausgabe ====
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, y):
# 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, y1, x2, y2, x3, y3, tiefe):
if tiefe == MAX_TIEFE:
# Code zu ergänzen: Auswahl der richtigen Farbe.
fillTriangle(x1, y1, x2, y2, x3, y3)
# 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, y1, a12, b12, a13, b13, tiefe + 1)
sierpinskiDreieck(a12, b12, x2, y2, a23, b23, tiefe + 1)
sierpinskiDreieck(a13, b13, a23, b23, x3, y3, tiefe + 1)
# Folgende Zeile auskommentieren, wenn man das gesamte Farbdreieck möchte.
# sierpinskiDreieck(a12, b12, a23, b23, a13, b13, tiefe + 1)
makeGPanel(Size(255, 222))
window(0, 255, 0, 222)
Px, Py = 0, 0
Qx, Qy = 255, 0
Rx, Ry = 128, 222
# auf Schulcomputern mit Windows funktioniert:
ausgabe = open("C:\\Users\\kleingeschreibenerVorname.kleingeschriebenerNachname\\sierpinski.svg", "w")
# Unter Linux (und wohl auch macOS):
# ausgabe = open("sierpinski.svg", "w")
ausgabe.write("\n")
ausgabe.close()
print("Fertig mit SVG!")
delay(2000)
dispose()
====== Einige Lösungsvorschläge ======
from gpanel import *
makeGPanel(Size(382, 382))
window(-127, 255, -127, 255)
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, g, b)
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("Schreibe ppm-Datei.")
ausgabe = open("C:\\Users\\kleingeschreibenerVorname.kleingeschriebenerNachname\\RGB-farbwuerfel.ppm", "w")
# ausgabe = open("RGB-color-cube.ppm", "w")
ausgabe.write("P3\n")
ausgabe.write("383 383\n")
ausgabe.write("255\n")
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]) + "\n")
print("Fertig!")
ausgabe.close()
delay(2000)
dispose()
from gpanel import *
# Bitte erhöhen, aber nicht viel grösser als 12 gehen.
MAX_TIEFE = 2
pausenZeit = 100
def sierpinskiDreieck(x1, y1, x2, y2, x3, y3, tiefe):
if tiefe == MAX_TIEFE:
fillTriangle(x1, y1, x2, y2, x3, y3)
# Damit auch etwas gezeichnet wird, wenn die Dreiecke
# "zu klein" sind.
if MAX_TIEFE > 7:
point(int(x1), int(y1))
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, y1, a12, b12, a13, b13, tiefe + 1)
sierpinskiDreieck(a12, b12, x2, y2, a23, b23, tiefe + 1)
sierpinskiDreieck(a13, b13, a23, b23, x3, y3, tiefe + 1)
makeGPanel(Size(255, 222))
window(0, 255, 0, 222)
Px, Py = 0, 0
Qx, Qy = 255, 0
Rx, Ry = 128, 222
sierpinskiDreieck(Px, Py, Qx, Qy, Rx, Ry, 0)
delay(2000)
dispose()
from gpanel import *
def berechneRGB(x, y):
# 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, 222))
window(0, 255, 0, 222)
for x in range(256):
for y in range(222):
r, g, b = berechneRGB(x, y)
# print(r, g, b)
farbe = makeColor(r, g, b)
setColor(farbe)
point(x, y)
delay(1000)
setColor("black")
triangle(0, 0, 255, 0, 128, 222)
delay(1000)
setColor("white")
fillTriangle(0, 0, 128, 222, 0, 222)
fillTriangle(256, 0, 256, 222, 128, 222)
delay(5000)
dispose()
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, y):
# 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 = "0" + s
return s
def sierpinskiDreieck(x1, y1, x2, y2, x3, y3, tiefe):
if tiefe == MAX_TIEFE:
r, g, b = berechneRGB((x1+x2+x3)/3, (y1+y2+y3)/3)
farbe = makeColor(r, g, b)
setColor(farbe)
fillTriangle(x1, y1, x2, y2, x3, y3)
# Damit auch etwas gezeichnet wird, wenn die Dreiecke
# "zu klein" sind.
if MAX_TIEFE > 7:
point(int(x1), int(y1))
ausgabe.write("\n")
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, y1, a12, b12, a13, b13, tiefe + 1)
sierpinskiDreieck(a12, b12, x2, y2, a23, b23, tiefe + 1)
sierpinskiDreieck(a13, b13, a23, b23, x3, y3, tiefe + 1)
# Folgende Zeile auskommentieren, wenn man das gesamte Farbdreieck möchte.
# sierpinskiDreieck(a12, b12, a23, b23, a13, b13, tiefe + 1)
makeGPanel(Size(255, 222))
window(0, 255, 0, 222)
Px, Py = 0, 0
Qx, Qy = 255, 0
Rx, Ry = 128, 222
ausgabe = open("C:\\Users\\kleingeschreibenerVorname.kleingeschriebenerNachname\\sierpinski.svg", "w")
# ausgabe = open("sierpinski.svg", "w")
# Wenn man auf Dateien in einem anderen Verzeichnis zugreifen will,
# muss man unter Windows den Pfad sinngemaess wie folgt angeben.
# ausgabe = open("C:\\Users\\Vorname.Nachname\\Downloads\\ausgabe.txt", "w")
ausgabe.write("\n")
ausgabe.close()
print("Fertig mit SVG!")
delay(2000)
dispose()
===== Link zur Kursseite =====
[[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]