This is an old revision of the document!
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
ppm-Datei für RGB-Farbwürfel als .txt (Da ich hier im dokuwiki keine SVG-Dateien hochladen konnte.)
und hier als png:
RGB-Farb-Sierpinski-Dreieck
RGB-Farbdreieck
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
<svg height='222' width='255'> <rect width='100%' height='100%' fill='#ffffff'/> <polyline points='0, 222 127.5, 222.0 64.0, 111.0 0, 222 ' style='fill:#ff0000'/> <polyline points='127.5, 222.0 255, 222 191.5, 111.0 127.5, 222.0 ' style='fill:#0000ff'/> <polyline points='64.0, 111.0 191.5, 111.0 128, 0 64.0, 111.0 ' style='fill:#00ff00'/> </svg>
Code 4: Vorlage für farbiges Sierpinski-Dreieck samt SVG-Ausgabe
from gpanel import * MAX_TIEFE = 6 # 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: # 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("<svg height='222' width='255'>\n") ausgabe.write("<rect width='100%' height='100%' fill='#ffffff'/>\n") sierpinskiDreieck(Px, Py, Qx, Qy, Rx, Ry, 0) ausgabe.write("</svg>\n") ausgabe.close() print("Fertig mit SVG!") delay(2000) dispose()
Einige Lösungsvorschläge
Link zur Kursseite
1)
Weiss ist hier und im nächsten Dreieck nicht genau im Schwerpunkt des 2-Simplex, damit relativ komplizierte Umrechnungen nicht zusätzliche Schwierigkeiten bereiten.