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 15:42] – Olaf Schnürer | lehrkraefte:snr:informatik:glf21:python:chaos-game [2021/09/15 15:26] (current) – [Derselbe Python-Code sehr ausführlich kommentiert] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Chaos-Spiel − der springende Punkt ===== | ||
| + | |||
| + | Das Chaos-Spiel geht wie folgt: | ||
| + | <WRAP round info> | ||
| + | Seien $A$, $B$, $C$ die Ecken eines gleichseitigen Dreiecks auf der Tafel. | ||
| + | |||
| + | Wähle zufällig einen weiteren Punkt $P$. Wir lassen diesen Punkt „springen“, | ||
| + | <WRAP round box> | ||
| + | - Wähle zufällig einen der Eckpunkte $A$, $B$, $C$, etwa mit Hilfe eines Würfels: | ||
| + | * $A$ falls der Würfel 1 oder 2 zeigt; | ||
| + | * $B$ falls er 3 oder 4 zeigt; | ||
| + | * $C$ falls er 5 oder 6 zeigt. | ||
| + | - Der „neue“ Punkt $P$ sei der Mittelpunkt zwischen dem „alten“ Punkt $P$ und dem erwürfelten Eckpunkt. | ||
| + | - Markiere diesen neuen Punkt $P$. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Kannst Du erraten, welche geometrische Figur herauskommt? | ||
| + | </ | ||
| + | |||
| + | |||
| + | Eine solche Folge von Handlungsanweisungen nennt man einen [[https:// | ||
| + | |||
| + | Das folgende Python-Programm ist eine [[https:// | ||
| + | |||
| + | <wrap lo>Ob es heutzutage bereits KI-Systeme (KI = Künstliche Intelligeny) gibt, die sprachliche Anweisungen wie oben direkt „verstehen“ und ausführen können, ist mir nicht bekannt. | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Lies das Python-Programm (auf dem eigenen Rechner) und versuche, es zu verstehen! | ||
| + | |||
| + | <wrap lo>Wer noch kein Python kann, wird beim ersten Lesen nichts oder nur wenig verstehen - der Sinn ist aber, dass ihr ähnlich wie beim äusserst effektiven frühkindlichen Erlernen der Muttersprache nun einer neuen Programmiersprache in einer nicht-trivialen Situation ausgesetzt werdet und durch Nachfragen und Erklärungen meinerseits mit der Zeit ein gewisses Verständnis entwickelt.</ | ||
| + | </ | ||
| + | |||
| + | ==== Python-Programm zum Chaos-Spiel ==== | ||
| + | <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, | ||
| + | </ | ||
| + | |||
| + | ==== Derselbe Python-Code sehr ausführlich kommentiert ==== | ||
| + | < | ||
| + | <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, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Bringe Tigerjython auf deinem Rechner zum Laufen. | ||
| + | | ||
| + | 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 in das Tigerjython-Fenster! | ||
| + | (Sind Ctrl-c, Ctrl-v zum Kopieren und Alt+Tab zum Fensterwechsel bekannt? Kann zum Kopieren auch den Clipboard-Icon rechts oben in der Code-Box nutzen.) | ||
| + | |||
| + | Bringe es mit dem Button (= Knopf) mit dem grünen Dreieck in der Menüleiste zum Laufen: | ||
| + | |||
| + | {{: | ||
| + | | ||
| + | Lerne Tigerjython kennen: Schau alle Menüpunkte an, lass den Mauszeiger über den Buttons schweben (= let the mouse hover over the buttons). | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | 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:// | ||
| + | </ | ||
| + | | ||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||
| + | |||
| + | |||