lehrkraefte:snr:informatik:glf21:python:chaos-game

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:snr:informatik:glf21:python:chaos-game [2021/08/17 17:08] Olaf Schnürerlehrkraefte: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“, indem wir die folgenden Anweisungen unendlich oft wiederholen:
 +<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>
 +</WRAP>
 +
 +<WRAP round todo>
 +Kannst Du erraten, welche geometrische Figur herauskommt?
 +</WRAP>
 +
 +
 +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.
 +
 +<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>
 +
 +<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.</wrap>
 +</WRAP>
 +
 +==== Python-Programm zum Chaos-Spiel ====
 +<code python>
 +# 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.")
 +</code>
 +
 +==== Derselbe Python-Code sehr ausführlich kommentiert ====
 +<hidden>
 +<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, 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.")
 +</code>
 +</hidden>
 +
 +----
 +
 +<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:
 +
 +{{: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).
 +</WRAP>
 +
 +<WRAP round todo>
 +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?
 +</WRAP>
 +  
 +===== Link zur Kursseite =====
 +
 +[[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]
 +
 +