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:54] 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 random import * | ||
+ | |||
+ | breite = 10000 | ||
+ | hoehe = 8660 | ||
+ | |||
+ | makeGPanel(" | ||
+ | |||
+ | # Koordinaten des Punkts A | ||
+ | xA = 0 | ||
+ | yA = 0 | ||
+ | |||
+ | # Koordinaten des Punkts B | ||
+ | xB = breite | ||
+ | yB = 0 | ||
+ | |||
+ | # Koordinaten des Punkts C | ||
+ | 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) | ||
+ | y = randint(0, hoehe) | ||
+ | |||
+ | point(int(x), | ||
+ | |||
+ | iterationen = 1000000 | ||
+ | |||
+ | for i in range(0, iterationen): | ||
+ | zufall = randint(1, 3) | ||
+ | if zufall == 1: | ||
+ | x = (x + xA) / 2 | ||
+ | y = (y + yA) / 2 | ||
+ | if zufall == 2: | ||
+ | x = (x + xB) / 2 | ||
+ | y = (y + yB) / 2 | ||
+ | if zufall == 3: | ||
+ | x = (x + xC) / 2 | ||
+ | y = (y + yC) / 2 | ||
+ | | ||
+ | point(int(x), | ||
+ | |||
+ | print(iterationen, | ||
</ | </ | ||
- | === Python-Code kommentiert === | + | ==== Derselbe |
< | < | ||
<code python> | <code python> | ||
+ | # Sierpinski-Dreieck per Chaos-Spiel | ||
+ | # Alle Zeilen, die mit dem Hash- oder Doppelkreuz-Symbol # beginnen, sind Kommentare | ||
+ | # und werden vom Computer beim Ausführen des Programms ignoriert. | ||
+ | # Leerzeilen dienen nur der besseren Strukturierung und werden ebenfalls vom Computer ignoriert. | ||
+ | |||
+ | # Import von Grafik- und Zufallsbefehlen (bitte ignorieren) | ||
+ | from gpanel import * | ||
+ | from random import * | ||
+ | |||
+ | # Es folgen zwei Zuweisungen, | ||
+ | # Wir weisen der Variablen " | ||
+ | # Das Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen. | ||
+ | # Es handelt sich um eine Zuweisung! (Dies wird weiter unten klarer.) | ||
+ | # (Wir werden die Variable " | ||
+ | # Analog wird die Variable/ | ||
+ | breite = 10000 | ||
+ | hoehe = 8660 | ||
+ | |||
+ | # Der folgende Befehl " | ||
+ | # Genauer wird der Bereich mit x-Koordinaten von 0 bis " | ||
+ | # y-Koordinaten von 0 bis " | ||
+ | # Jedes Pixel (= jeder Bildpunkt) mit ganzzahligen Koordinaten in diesem Bereich kann später gefärbt werden. | ||
+ | # In der Titelleiste des Fensters erscheint die Zeichenkette (englisch string) | ||
+ | # " | ||
+ | # Der englische Begriff " | ||
+ | makeGPanel(" | ||
+ | |||
+ | # Wir haben die Variable " | ||
+ | # mit horizontaler Grundseite genau in unseren Zeichenbereich passt: | ||
+ | # 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 Punkts A | ||
+ | xA = 0 | ||
+ | yA = 0 | ||
+ | |||
+ | # Koordinaten des Punkts B | ||
+ | xB = breite | ||
+ | yB = 0 | ||
+ | |||
+ | # Koordinaten des Punkts C | ||
+ | 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 | ||
+ | x = randint(0, breite) | ||
+ | y = randint(0, hoehe) | ||
+ | |||
+ | # Markiere das Pixel mit Koordinaten (x,y) oder genauer (int(x), int(y)). | ||
+ | # Die Funktion " | ||
+ | # Koordinaten in der aktuellen Zeichenfarbe (schwarz) an. | ||
+ | point(int(x), | ||
+ | |||
+ | # 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. | ||
+ | # (Hierbei ist iterationen - 1 unser Ersatz für unendlich.) | ||
+ | # Für jeden dieser Werte wird der nachfolgende eingerückte Bereich (Einrückung jeweis vier Leerzeichen) | ||
+ | # genau einmal durchlaufen. | ||
+ | # ACHTUNG: Falsche Einrückungen verursachen Fehler. | ||
+ | for i in range(0, iterationen): | ||
+ | |||
+ | # Weise der Variablen " | ||
+ | # Wir wuerfeln sozusagen mit einem dreiseitigen Wuerfel. Dabei sind alle Zahlen 1, 2, 3 gleich wahrscheinlich. | ||
+ | zufall = randint(1, 3) | ||
+ | | ||
+ | # Es folgt eine sogenannte " | ||
+ | # Falls die Variable " | ||
+ | # werden die folgenden eingerueckten Zeilen durchgeführt. | ||
+ | if zufall == 1: | ||
+ | | ||
+ | # Die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate | ||
+ | # des springenden Punktes und der x-Koordinate von A. | ||
+ | # Hier wird nun klar, dass " | ||
+ | # Der Variablen x links wird als neuem Wert das zugewiesen, | ||
+ | # was die Berechnung rechts ergibt - in dieser Berechnung wird der alte Wert von x verwendet. | ||
+ | x = (x + xA) / 2 | ||
+ | | ||
+ | # Analog fuer die neue y-Koordinate | ||
+ | y = (y + yA) / 2 | ||
+ | | ||
+ | # Hier endet der eingerückte Befehlsblock, | ||
+ | | ||
+ | # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar. | ||
+ | if zufall == 2: | ||
+ | x = (x + xB) / 2 | ||
+ | y = (y + yB) / 2 | ||
+ | if zufall == 3: | ||
+ | x = (x + xC) / 2 | ||
+ | y = (y + yC) / 2 | ||
+ | | ||
+ | point(int(x), | ||
+ | |||
+ | # Die folgenden Zeilen auskommentieren, | ||
+ | # Beispielsweise macht " | ||
+ | # | ||
+ | # if i < 1000: | ||
+ | # delay (10) | ||
+ | # if i < 10000: | ||
+ | # delay (1) | ||
+ | # if i == 0: | ||
+ | # print(" | ||
+ | # if i == 1000: | ||
+ | # print(" | ||
+ | # if i == 10000: | ||
+ | # print(" | ||
+ | |||
+ | # Hier endet die for-Schleife, | ||
+ | |||
+ | # Gib aus, wie viele Punkte gezeichnet wurden. | ||
+ | print(iterationen, | ||
</ | </ | ||
</ | </ | ||
Line 52: | 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 62: | 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: | |
- | | + | |