===== Chaos-Spiel − der springende Punkt ===== Das Chaos-Spiel geht wie folgt: 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“, indem wir die folgenden Anweisungen unendlich oft wiederholen: - 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$. Kannst Du erraten, welche geometrische Figur herauskommt? Eine solche Folge von Handlungsanweisungen nennt man einen [[https://de.wikipedia.org/wiki/Algorithmus|Algorithmus]]. Jedes Kochrezept oder jede Bastelanleitung oder jede Spielanleitung ist ein Beispiel für einen Algorithmus. Das folgende Python-Programm ist eine [[https://de.wikipedia.org/wiki/Implementierung#Softwaretechnik|Implementierung]] des Chaos-Spiel-Algorithmus - wir sagen dem Computer also mit Hilfe der Programmiersprache Python in präziser, computerverständlicher Form, was er tun soll. 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. Lies das Python-Programm (auf dem eigenen Rechner) und versuche, es zu verstehen! 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 ==== # Sierpinski-Dreieck per Chaos-Spiel from gpanel import * from random import * breite = 10000 hoehe = 8660 makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe) # 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 "dickere" Pixel: # 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), int(y)) 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), int(y)) print(iterationen, "Iterationen durchgeführt.") ==== Derselbe Python-Code sehr ausführlich kommentiert ==== # 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, kodiert durch das Gleichheitszeichen "=": # Wir weisen der Variablen "breite" den Wert 10000 rechts des Gleichheitszeichens zu. # Das Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen. # Es handelt sich um eine Zuweisung! (Dies wird weiter unten klarer.) # (Wir werden die Variable "breite" im Programm nicht ändern - es handelt sich also genauer um eine Konstante.) # Analog wird die Variable/Konstante "hoehe" auf 8660 gesetzt. breite = 10000 hoehe = 8660 # Der folgende Befehl "makeGPanel" erzeugt ein Fenster mit einem rechteckigem Ausschnitt der Zeichenebene. # Genauer wird der Bereich mit x-Koordinaten von 0 bis "breite" und # y-Koordinaten von 0 bis "hoehe" bereitgestellt. # 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) # "Sierpinski triangle chaos game". # Der englische Begriff "panel" bedeutet "Tafel". makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe) # Wir haben die Variable "hoehe" so gewählt, dass ein gleichseitiges Dreieck # mit horizontaler Grundseite genau in unseren Zeichenbereich passt: # Die Höhe eines gleichseitigen Dreiecks mit Grundseite 1 ist nach # Pythagoras gerade Quadratwurzel(3)/2. Etwas komplizierter hätten wir oben # hoehe = int(sqrt(3)/2 * breite) # schreiben können: Die Funktion "sqrt" fuer englisch "square root" berechnet die Quadratwurzel. # Die Funktion "int" wandelt eine Gleitkommazahl (also eine Zahl mit endlich vielen Nachkommastellen) # 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 "int" ist oben erklärt. # Zum Ändern der Dicke des Stifts bzw. für "dickere" Pixel: # 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 "point" nimmt zwei ganze Zahlen als Argumente und zeigt das Pixel mit den entsprechenden # Koordinaten in der aktuellen Zeichenfarbe (schwarz) an. point(int(x), int(y)) # Anzahl der Iterationen. Eigentlich ist es guter Programmierstil, Konstanten, die man beim Testen # eventuell rasch ändern muss, am Anfang zu definieren. iterationen = 1000000 # Es folgt eine sogenannte "for-Schleife" (englisch "for loop"). # 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 "zufall" eine Zufallszahl zu, die den Wert 1,2 oder 3 hat. # Wir wuerfeln sozusagen mit einem dreiseitigen Wuerfel. Dabei sind alle Zahlen 1, 2, 3 gleich wahrscheinlich. zufall = randint(1, 3) # Es folgt eine sogenannte "if-Bedingung" (englisch "if condition"): # Falls die Variable "zufall" den Wert 1 hat (Gleichheit von Variablen wird mit "==" und nicht mit "=" abgefragt), # 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 "=" eine Zuweisung ist und kein Gleichheitszeichen: # 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, der ausgefuehrt wird, wenn zufall == 1 gilt. # 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), int(y)) # Die folgenden Zeilen auskommentieren, wenn man will, dass das Programm anfangs langsamer durchgefuehrt wird: # Beispielsweise macht "delay(42)" macht eine Pause von 42 Millisekunden. # # if i < 1000: # delay (10) # if i < 10000: # delay (1) # if i == 0: # print("lange Pausen") # if i == 1000: # print("kurze Pausen") # if i == 10000: # print("keine Pausen") # Hier endet die for-Schleife, denn der folgende Befehl ist nicht mehr eingerueckt. # Gib aus, wie viele Punkte gezeichnet wurden. print(iterationen, "Iterationen durchgeführt.") ---- 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: {{:lehrkraefte:snr:informatik:glf21:python:chaos-game:menu-tigerjython.png?nolink&200|}} Lerne Tigerjython kennen: Schau alle Menüpunkte an, lass den Mauszeiger über den Buttons schweben (= let the mouse hover over the buttons). Wer selbst etwas experimentieren und das Programm verändern möchte, findet Anregungen auf [[https://en.wikipedia.org/wiki/Chaos_game|Wikipedia - Chaos game]]. Dort ist auch ein Link auf das Sierpiński-Dreieck - so heisst die Figur, die unser Chaos-Spiel produziert hat. Wer mag, darf natürlich auch gerne die Einführung [[https://www.tigerjython.ch| Tigerjython]] anschauen. Dort ist auch erklärt, wie man Tigerjython auf dem eigenen Rechner installiert. Wer kann es auf dem iPad installieren? ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]