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

This is an old revision of the document!


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:

  1. 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.
  2. Der „neue“ Punkt $P$ sei der Mittelpunkt zwischen dem „alten“ Punkt $P$ und dem erwürfelten Eckpunkt.
  3. Markiere diesen neuen Punkt $P$.

Welche geometrische Figur ergibt sich?

Eine solche Folge von Handlungsanweisungen nennt man einen Algorithmus. Jedes Kochrezept oder jede Bastelanleitung oder jede Spielanleitung ist ein Beispiel für einen Algorithmus.

Das folgende Python-Programm ist eine 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

from gpanel import *
from random import * 
 
iterationen = 1000000
 
breite = 10000
hoehe = int(sqrt(3)/2 * breite)
makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe)
 
x1 = 0
y1 = 0
 
x2 = breite
y2 = 0
 
x3 = int(breite / 2)
y3 = hoehe
 
x = randint(0, breite)
y = randint(0, hoehe)
 
for i in range(0, iterationen):
    zufall = randint(1, 3)
    if zufall == 1:
        x = (x + x1) / 2
        y = (y + y1) / 2
    if zufall == 2:
        x = (x + x2) / 2
        y = (y + y2) / 2
    if zufall == 3: 
        x = (x + x3) / 2        
        y = (y + y3) / 2
    point(int(x), int(y))
 
print(iterationen, "Iterationen durchgeführt.")

Python-Code kommentiert

Click to display ⇲

Click to hide ⇱

# Sierpinski-Dreieck per Chaos-Spiel
# Alle Zeilen, die mit dem Hash-Symbol (= Doppelkreuz-Symbol) # beginnen, sind Kommentare
# und werden vom Computer beim Ausführen des Programms ignoriert.
# Leerzeilen dienen nur der bessern Strukturierung und werden ebenfalls vom Computer ignoriert.
 
# Import von Grafik- und Zufallsbefehlen
from gpanel import *
from random import * 
 
# Anzahl der Iterationen - es ist guter Programmierstil, Konstanten, die man beim Testen 
# eventuell rasch ändern muss, am Anfang zu definieren. 
iterationen = 1000000
 
# Pixel (= Bildpunkte) in jeder Zeile
breite = 10000
 
# Pixel in jeder Spalte
hoehe = int(sqrt(3)/2 * breite)
# Die Funktion sqrt fuer englisch "square root" berechnet die Quadratwurzel.
# Die Funktion int() wandelt eine Gleitkommazahl durch Abschneiden der Nachkommastellen in eine 
# ganze Zahl (engl. integer) um. (Runden wäre wohl besser.)
#
# Die Variable hoehe ist die Hoehe eines gleichseitigen Dreiecks mit Grundseite der Laenge breite.
# Nach Pythagoras hat ein gleichseitiges Dreieck mit Seitenlaenge Eins die Hoehe Wurzel(3)/2.
 
# Der Behehl makeGPanel erzeugt ein Fenster mit einem rechteckigem Ausschnitt der Zeichenebene,
# x-Koordinaten von 0 bis breite, y-Koordinaten von 0 bis hoehe. Der englische Begriff panel
# bedeutet Tafel.
makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe)
# Die Abmessungen sind so gewaehlt, dass ein gleichseitiges Dreieck mit waagerechter Grundseite 
# genau hineinpasst.
 
# Koordinaten des ersten Punkts A
x1 = 0
y1 = 0
 
# Koordinaten des zweiten Punktes B
x2 = breite
y2 = 0
 
# Koordinaten des dritten Punktes C
x3 = int(breite / 2)
y3 = hoehe
 
# zufaellige Startkoordinaten des springenden Punktes
x = randint(0, breite)
y = randint(0, hoehe)
 
for i in range(0, iterationen):
# Eine sogenannte for-Schleife. Die Variable i nimmt nacheinander die Werte 0, 1, 2, ..., iterationen - 1 an.
# Beachte, dass der Wert iterationen nicht angenommen wird.
# Alles innerhalb der Schleife ist eingerückt - jeweils vier Leerzeichen.
 
    zufall = randint(1, 3)
    # Eine Zufallszahl, die den Wert 1,2 oder 3 hat.
    # Wir wuerfeln also mit einem dreiseitigen Wuerfel. 
    # Alle Zahlen sind gleich wahrscheinlich.
 
    if zufall == 1:
    # if-Bedingung: 
    # Falls die Variable zufall den Wert 1 hat (Gleichheit von Variablen wird mit == und nicht mit = abgefragt),
    # werden die folgenden eingerueckten Zeilen durchgeführt.
 
        # die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate
        # des springenden Punktes und der x-Koordinate von A.
        # Dieses Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen. 
        # 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 wird.  
        x = (x + x1) / 2
 
        # Analog fuer die neue y-Koordinate
        y = (y + y1) / 2
 
        # Hier endet der Befehlsblock, der ausgefuehrt wird, wenn zufall == 1 gilt.
 
    # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar.
    if zufall == 2:
        x = (x + x2) / 2
        y = (y + y2) / 2
    if zufall == 3: 
        x = (x + x3) / 2        
        y = (y + y3) / 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), int(y))
 
#    Die folgenden Zeilen auskommentieren, wenn man will, dass das Programm langsamer durchgefuehrt wird:
#    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.
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 (sind Ctrl-c, Ctrl-v bekannt? kann auch den Clipboard-Icon rechts oben in der Code-Box nutzen) in das Tigerjython-Fenster und 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).

Wer selbst etwas experimentieren und das Programm verändern möchte, findet Anregungen auf 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 Tigerjython anschauen.

  • lehrkraefte/snr/informatik/glf21/python/chaos-game.1629214951.txt.gz
  • Last modified: 2021/08/17 17:42
  • by Olaf Schnürer