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:glf21:python:chaos-game [2021/08/17 17:42] Olaf Schnürer |
lehrkraefte:snr:informatik:glf21:python:chaos-game [2021/09/15 17:26] (current) Olaf Schnürer [Derselbe Python-Code sehr ausführlich kommentiert] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== Chaos-Spiel − der springende Punkt ==== | + | ===== Chaos-Spiel − der springende Punkt ===== |
Das Chaos-Spiel geht wie folgt: | Das Chaos-Spiel geht wie folgt: | ||
Line 17: | Line 17: | ||
<WRAP round todo> | <WRAP round todo> | ||
- | Welche | + | Kannst Du erraten, welche |
</ | </ | ||
Line 34: | Line 34: | ||
</ | </ | ||
- | === Python-Programm zum Chaos-Spiel === | + | ==== Python-Programm zum Chaos-Spiel ==== |
<code python> | <code python> | ||
+ | # Sierpinski-Dreieck per Chaos-Spiel | ||
+ | |||
from gpanel import * | from gpanel import * | ||
from random import * | from random import * | ||
- | |||
- | iterationen = 1000000 | ||
breite = 10000 | breite = 10000 | ||
- | hoehe = int(sqrt(3)/ | + | hoehe = 8660 |
makeGPanel(" | makeGPanel(" | ||
- | x1 = 0 | + | # Koordinaten des Punkts A |
- | y1 = 0 | + | xA = 0 |
+ | yA = 0 | ||
- | x2 = breite | + | # Koordinaten des Punkts B |
- | y2 = 0 | + | xB = breite |
+ | yB = 0 | ||
- | x3 = int(breite / 2) | + | # Koordinaten des Punkts C |
- | y3 = hoehe | + | xC = int(breite / 2) |
+ | yC = hoehe | ||
+ | # Zum Ändern der Dicke des Stifts bzw. für " | ||
+ | # lineWidth(2) | ||
+ | |||
+ | line (xA, yA, xB, yB) | ||
+ | line (xB, yB, xC, yC) | ||
+ | line (xC, yC, xA, yA) | ||
+ | |||
+ | # zufaellige Startkoordinaten des springenden Punktes | ||
x = randint(0, breite) | x = randint(0, breite) | ||
y = randint(0, hoehe) | y = randint(0, hoehe) | ||
- | | + | |
+ | point(int(x), | ||
+ | |||
+ | iterationen = 1000000 | ||
for i in range(0, iterationen): | for i in range(0, iterationen): | ||
zufall = randint(1, 3) | zufall = randint(1, 3) | ||
if zufall == 1: | if zufall == 1: | ||
- | x = (x + x1) / 2 | + | x = (x + xA) / 2 |
- | y = (y + y1) / 2 | + | y = (y + yA) / 2 |
if zufall == 2: | if zufall == 2: | ||
- | x = (x + x2) / 2 | + | x = (x + xB) / 2 |
- | y = (y + y2) / 2 | + | y = (y + yB) / 2 |
if zufall == 3: | if zufall == 3: | ||
- | x = (x + x3) / 2 | + | x = (x + xC) / 2 |
- | y = (y + y3) / 2 | + | y = (y + yC) / 2 |
- | point(int(x), | + | |
| | ||
+ | point(int(x), | ||
+ | |||
print(iterationen, | print(iterationen, | ||
</ | </ | ||
- | === Python-Code kommentiert === | + | ==== Derselbe |
< | < | ||
<code python> | <code python> | ||
# Sierpinski-Dreieck per Chaos-Spiel | # Sierpinski-Dreieck per Chaos-Spiel | ||
- | # Alle Zeilen, die mit dem Hash-Symbol (= Doppelkreuz-Symbol) # beginnen, sind Kommentare | + | # Alle Zeilen, die mit dem Hash- oder Doppelkreuz-Symbol # beginnen, sind Kommentare |
# und werden vom Computer beim Ausführen des Programms ignoriert. | # und werden vom Computer beim Ausführen des Programms ignoriert. | ||
- | # Leerzeilen dienen nur der bessern | + | # Leerzeilen dienen nur der besseren |
- | # Import von Grafik- und Zufallsbefehlen | + | # Import von Grafik- und Zufallsbefehlen |
from gpanel import * | from gpanel import * | ||
from random import * | from random import * | ||
- | # Anzahl der Iterationen - es ist guter Programmierstil, | + | # Es folgen zwei Zuweisungen, kodiert durch das Gleichheitszeichen " |
- | # eventuell rasch ändern muss, am Anfang | + | # Wir weisen der Variablen " |
- | iterationen = 1000000 | + | # Das Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen. |
- | + | # Es handelt sich um eine Zuweisung! (Dies wird weiter unten klarer.) | |
- | # Pixel (= Bildpunkte) in jeder Zeile | + | # (Wir werden die Variable " |
+ | # Analog wird die Variable/ | ||
breite = 10000 | breite = 10000 | ||
+ | hoehe = 8660 | ||
- | # Pixel in jeder Spalte | + | # Der folgende Befehl |
- | hoehe = int(sqrt(3)/ | + | # Genauer wird der Bereich mit x-Koordinaten von 0 bis "breite" und |
- | # Die Funktion sqrt fuer englisch | + | # y-Koordinaten von 0 bis "hoehe" bereitgestellt. |
- | # Die Funktion int() wandelt eine Gleitkommazahl durch Abschneiden der Nachkommastellen in eine | + | # Jedes Pixel (= jeder Bildpunkt) mit ganzzahligen Koordinaten in diesem Bereich kann später gefärbt werden. |
- | # ganze Zahl (engl. integer) um. (Runden wäre wohl besser.) | + | # In der Titelleiste des Fensters erscheint die Zeichenkette (englisch string) |
- | # | + | # " |
- | # Die Variable hoehe ist die Hoehe eines gleichseitigen Dreiecks mit Grundseite der Laenge breite. | + | # Der englische Begriff |
- | # Nach Pythagoras hat ein gleichseitiges Dreieck mit Seitenlaenge Eins die Hoehe Wurzel(3)/ | + | |
- | + | ||
- | # Der Behehl makeGPanel | + | |
- | # x-Koordinaten von 0 bis breite, y-Koordinaten von 0 bis hoehe. Der englische Begriff panel | + | |
- | # bedeutet Tafel. | + | |
makeGPanel(" | makeGPanel(" | ||
- | # Die Abmessungen sind so gewaehlt, dass ein gleichseitiges Dreieck mit waagerechter Grundseite | ||
- | # genau hineinpasst. | ||
- | # Koordinaten des ersten Punkts A | + | # Wir haben die Variable " |
- | x1 = 0 | + | # mit horizontaler Grundseite genau in unseren Zeichenbereich passt: |
- | y1 = 0 | + | # Die Höhe eines gleichseitigen Dreiecks mit Grundseite 1 ist nach |
+ | # Pythagoras gerade Quadratwurzel(3)/ | ||
+ | # hoehe = int(sqrt(3)/ | ||
+ | # schreiben können: Die Funktion " | ||
+ | # Die Funktion " | ||
+ | # durch Abschneiden der Nachkommastellen in eine ganze Zahl (engl. integer) um. | ||
- | # Koordinaten des zweiten Punktes B | + | # Koordinaten des Punkts A |
- | x2 = breite | + | xA = 0 |
- | y2 = 0 | + | yA = 0 |
- | # Koordinaten des dritten Punktes | + | # Koordinaten des Punkts B |
- | x3 = int(breite / 2) | + | xB = breite |
- | y3 = hoehe | + | yB = 0 |
+ | |||
+ | # Koordinaten des Punkts | ||
+ | xC = int(breite / 2) | ||
+ | yC = hoehe | ||
+ | # Die Funktion " | ||
+ | |||
+ | # Zum Ändern der Dicke des Stifts bzw. für " | ||
+ | # lineWidth(2) | ||
+ | |||
+ | # Zeichnet gerade Linien zwischen den angegebenen Punkten | ||
+ | line (xA, yA, xB, yB) | ||
+ | line (xB, yB, xC, yC) | ||
+ | line (xC, yC, xA, yA) | ||
# zufaellige Startkoordinaten des springenden Punktes | # zufaellige Startkoordinaten des springenden Punktes | ||
x = randint(0, breite) | x = randint(0, breite) | ||
y = randint(0, hoehe) | y = randint(0, hoehe) | ||
- | | + | |
- | for i in range(0, iterationen): | + | # Markiere das Pixel mit Koordinaten (x,y) oder genauer (int(x), int(y)). |
- | # Eine sogenannte for-Schleife. Die Variable i nimmt nacheinander die Werte 0, 1, 2, ..., iterationen - 1 an. | + | # Die Funktion " |
+ | # Koordinaten | ||
+ | point(int(x), int(y)) | ||
+ | |||
+ | # Anzahl der Iterationen. Eigentlich ist es guter Programmierstil, | ||
+ | # eventuell rasch ändern muss, am Anfang zu definieren. | ||
+ | iterationen = 1000000 | ||
+ | |||
+ | # Es folgt eine sogenannte | ||
+ | # Die Variable i nimmt nacheinander die Werte 0, 1, 2, ..., iterationen - 1 an. | ||
# Beachte, dass der Wert iterationen nicht angenommen wird. | # Beachte, dass der Wert iterationen nicht angenommen wird. | ||
- | # Alles innerhalb der Schleife | + | # (Hierbei |
- | | + | # Für jeden dieser Werte wird der nachfolgende eingerückte Bereich (Einrückung jeweis |
+ | # genau einmal durchlaufen. | ||
+ | # ACHTUNG: Falsche Einrückungen verursachen Fehler. | ||
+ | for i in range(0, iterationen): | ||
+ | |||
+ | | ||
+ | # Wir wuerfeln sozusagen mit einem dreiseitigen Wuerfel. Dabei sind alle Zahlen 1, 2, 3 gleich wahrscheinlich. | ||
zufall = randint(1, 3) | zufall = randint(1, 3) | ||
- | # Eine Zufallszahl, | ||
- | # Wir wuerfeln also mit einem dreiseitigen Wuerfel. | ||
- | # Alle Zahlen sind gleich wahrscheinlich. | ||
| | ||
- | | + | # Es folgt eine sogenannte "if-Bedingung" (englisch "if condition" |
- | | + | # Falls die Variable |
- | # Falls die Variable zufall den Wert 1 hat (Gleichheit von Variablen wird mit == und nicht mit = abgefragt), | + | |
# werden die folgenden eingerueckten Zeilen durchgeführt. | # werden die folgenden eingerueckten Zeilen durchgeführt. | ||
+ | if zufall == 1: | ||
| | ||
- | # die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate | + | # Die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate |
# des springenden Punktes und der x-Koordinate von A. | # des springenden Punktes und der x-Koordinate von A. | ||
- | # Dieses Gleichheitszeichen | + | # Hier wird nun klar, dass " |
- | # Es handelt sich um eine Zuweisung! | + | # Der Variablen x links wird als neuem Wert das zugewiesen, |
- | # was die Berechnung rechts ergibt, wo der alte Wert von x verwendet | + | # was die Berechnung rechts ergibt |
- | x = (x + x1) / 2 | + | x = (x + xA) / 2 |
| | ||
# Analog fuer die neue y-Koordinate | # Analog fuer die neue y-Koordinate | ||
- | y = (y + y1) / 2 | + | y = (y + yA) / 2 |
| | ||
- | # Hier endet der Befehlsblock, | + | # Hier endet der eingerückte |
| | ||
# Die beiden folgenden if-Bedingungen sind nun hoffentlich klar. | # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar. | ||
if zufall == 2: | if zufall == 2: | ||
- | x = (x + x2) / 2 | + | x = (x + xB) / 2 |
- | y = (y + y2) / 2 | + | y = (y + yB) / 2 |
if zufall == 3: | if zufall == 3: | ||
- | x = (x + x3) / 2 | + | x = (x + xC) / 2 |
- | y = (y + y3) / 2 | + | y = (y + yC) / 2 |
| | ||
- | # Markiere den neuen Punkt (x,y) oder genauer (int(x), int(y)). | ||
- | # Die Funktion point nimmt zwei ganze Zahlen als Argumente und zeigt das Pixel mit den entsprechenden | ||
- | # Koordinaten in der aktuellen Zeichenfarbe (schwarz) an. | ||
point(int(x), | point(int(x), | ||
- | # Die folgenden Zeilen auskommentieren, | + | # Die folgenden Zeilen auskommentieren, |
- | # delay(42) macht eine Pause von 42 Millisekunden. | + | # |
# | # | ||
# if i < 1000: | # if i < 1000: | ||
Line 180: | Line 218: | ||
# Hier endet die for-Schleife, | # Hier endet die for-Schleife, | ||
+ | |||
+ | # Gib aus, wie viele Punkte gezeichnet wurden. | ||
print(iterationen, | print(iterationen, | ||
</ | </ | ||
Line 191: | Line 231: | ||
Richte das Browser-Fenster links ein und das Tigerjython-Fenster rechts, so dass sie jeweils die halbe Bildschirmbreite einnehmen - dies ermöglicht effektives Arbeiten. | Richte das Browser-Fenster links ein und das Tigerjython-Fenster rechts, so dass sie jeweils die halbe Bildschirmbreite einnehmen - dies ermöglicht effektives Arbeiten. | ||
| | ||
- | Kopiere das obige Programm (sind Ctrl-c, Ctrl-v bekannt? | + | Kopiere das obige Programm |
+ | (Sind Ctrl-c, Ctrl-v | ||
+ | |||
+ | Bringe | ||
{{: | {{: | ||
Line 201: | Line 244: | ||
Wer selbst etwas experimentieren und das Programm verändern möchte, findet Anregungen auf [[https:// | Wer selbst etwas experimentieren und das Programm verändern möchte, findet Anregungen auf [[https:// | ||
- | Wer mag, darf natürlich auch gerne die Einführung [[https:// | + | Wer mag, darf natürlich auch gerne die Einführung [[https:// |
</ | </ | ||
- | |||
- | |||
| | ||
+ | ===== Link zur Kursseite ===== | ||
+ | |||
+ | [[lehrkraefte: | ||