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:42]
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 geometrische Figur ergibt sich?+Kannst Du erraten, welche geometrische Figur herauskommt?
 </WRAP> </WRAP>
  
Line 34: Line 34:
 </WRAP> </WRAP>
  
-=== Python-Programm zum Chaos-Spiel === +==== Python-Programm zum Chaos-Spiel ====
 <code python> <code python>
 +# Sierpinski-Dreieck per Chaos-Spiel
 +
 from gpanel import * from gpanel import *
 from random import *  from random import * 
- 
-iterationen = 1000000 
  
 breite = 10000 breite = 10000
-hoehe = int(sqrt(3)/2 * breite)+hoehe = 8660 
 makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe) makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe)
  
-x1 = 0 +# Koordinaten des Punkts A 
-y1 = 0+xA = 0 
 +yA = 0
  
-x2 = breite +# Koordinaten des Punkts B 
-y2 = 0+xB = breite 
 +yB = 0
  
-x3 = int(breite / 2) +# Koordinaten des Punkts C 
-y3 = hoehe+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) x = randint(0, breite)
 y = randint(0, hoehe) y = randint(0, hoehe)
-    + 
 +point(int(x), int(y)) 
 + 
 +iterationen = 1000000 
 for i in range(0, iterationen): for i in range(0, iterationen):
     zufall = randint(1, 3)     zufall = randint(1, 3)
     if zufall == 1:     if zufall == 1:
-        x = (x + x1) / 2 +        x = (x + xA) / 2 
-        y = (y + y1) / 2+        y = (y + yA) / 2
     if zufall == 2:     if zufall == 2:
-        x = (x + x2) / 2 +        x = (x + xB) / 2 
-        y = (y + y2) / 2+        y = (y + yB) / 2
     if zufall == 3:      if zufall == 3: 
-        x = (x + x3) / 2         +        x = (x + xC) / 2         
-        y = (y + y3) / 2 +        y = (y + yC) / 2
-    point(int(x), int(y))+
          
 +    point(int(x), int(y))
 +
 print(iterationen, "Iterationen durchgeführt.") print(iterationen, "Iterationen durchgeführt.")
 </code> </code>
  
-=== Python-Code kommentiert ===+==== Derselbe Python-Code sehr ausführlich kommentiert ====
 <hidden> <hidden>
 <code python> <code python>
 # Sierpinski-Dreieck per Chaos-Spiel # Sierpinski-Dreieck per Chaos-Spiel
-# Alle Zeilen, die mit dem Hash-Symbol (= Doppelkreuz-Symbol# beginnen, sind Kommentare+# Alle Zeilen, die mit dem Hash- oder Doppelkreuz-Symbol # beginnen, sind Kommentare
 # und werden vom Computer beim Ausführen des Programms ignoriert. # und werden vom Computer beim Ausführen des Programms ignoriert.
-# Leerzeilen dienen nur der bessern Strukturierung und werden ebenfalls vom Computer ignoriert.+# Leerzeilen dienen nur der besseren Strukturierung und werden ebenfalls vom Computer ignoriert.
  
-# Import von Grafik- und Zufallsbefehlen+# Import von Grafik- und Zufallsbefehlen (bitte ignorieren)
 from gpanel import * from gpanel import *
 from random import *  from random import * 
  
-Anzahl der Iterationen - es ist guter Programmierstil, Konstantendie man beim Testen  +Es folgen zwei Zuweisungenkodiert durch das Gleichheitszeichen "=": 
-eventuell rasch ändern muss, am Anfang zu definieren.  +Wir weisen der Variablen "breite" den Wert 10000 rechts des Gleichheitszeichens zu. 
-iterationen = 1000000 +# Das Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen.  
- +# Es handelt sich um eine Zuweisung! (Dies wird weiter unten klarer.) 
-Pixel (= Bildpunktein jeder Zeile+# (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 breite = 10000
 +hoehe = 8660
  
-Pixel in jeder Spalte +Der folgende Befehl "makeGPanel" erzeugt ein Fenster mit einem rechteckigem Ausschnitt der Zeichenebene. 
-hoehe = int(sqrt(3)/2 * breite) +Genauer wird der Bereich mit x-Koordinaten von 0 bis "breite" und 
-# Die Funktion sqrt fuer englisch "square rootberechnet die Quadratwurzel. +y-Koordinaten von 0 bis "hoehe" bereitgestellt. 
-# Die Funktion int() wandelt eine Gleitkommazahl durch Abschneiden der Nachkommastellen in eine  +# Jedes Pixel (= jeder Bildpunkt) mit ganzzahligen Koordinaten in diesem Bereich kann später gefärbt werden. 
-# ganze Zahl (engl. integer) um. (Runden wäre wohl besser.) +# In der Titelleiste des Fensters erscheint die Zeichenkette (englisch string) 
-+# "Sierpinski triangle chaos game"
-# Die Variable hoehe ist die Hoehe eines gleichseitigen Dreiecks mit Grundseite der Laenge breite. +Der englische Begriff "panelbedeutet "Tafel".
-# 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 breitey-Koordinaten von 0 bis hoehe. Der englische Begriff panel +
-bedeutet Tafel.+
 makeGPanel("Sierpinski triangle chaos game", 0, breite, 0, hoehe) 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 +Wir haben die Variable "hoehe" so gewählt, dass ein gleichseitiges Dreieck 
-x1 = 0 +# mit horizontaler Grundseite genau in unseren Zeichenbereich passt: 
-y1 0+# 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 zweiten Punktes B +# Koordinaten des Punkts A 
-x2 breite +xA 0 
-y2 = 0+yA = 0
  
-# Koordinaten des dritten Punktes +# Koordinaten des Punkts B 
-x3 = int(breite / 2) +xB = breite 
-y3 = hoehe+yB = 0 
 + 
 +# Koordinaten des Punkts 
 +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 # zufaellige Startkoordinaten des springenden Punktes
 x = randint(0, breite) x = randint(0, breite)
 y = randint(0, hoehe) y = randint(0, hoehe)
-     + 
-for i in range(0iterationen): +# Markiere das Pixel mit Koordinaten (x,y) oder genauer (int(x), int(y)).  
-Eine sogenannte for-Schleife. Die Variable i nimmt nacheinander die Werte 0, 1, 2, ..., iterationen - 1 an.+# 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. # Beachte, dass der Wert iterationen nicht angenommen wird.
-Alles innerhalb der Schleife ist eingerückt jeweils vier Leerzeichen. +(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)     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: +    # Es folgt eine sogenannte "if-Bedingung" (englisch "if condition"):  
-    # if-Bedingung:  +    # Falls die Variable "zufallden Wert 1 hat (Gleichheit von Variablen wird mit "==und nicht mit "=abgefragt),
-    # Falls die Variable zufall den Wert 1 hat (Gleichheit von Variablen wird mit == und nicht mit = abgefragt),+
     # werden die folgenden eingerueckten Zeilen durchgeführt.     # werden die folgenden eingerueckten Zeilen durchgeführt.
 +    if zufall == 1:
          
-        # die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate+        # Die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate
         # des springenden Punktes und der x-Koordinate von A.         # des springenden Punktes und der x-Koordinate von A.
-        # Dieses Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen.  +        # Hier wird nun klar, dass "=" eine Zuweisung ist und kein Gleichheitszeichen: 
-        # Es handelt sich um eine Zuweisung! Der Variablen x links wird als neuem Wert das zugewiesen, +        # Der Variablen x links wird als neuem Wert das zugewiesen, 
-        # was die Berechnung rechts ergibt, wo der alte Wert von x verwendet wird  +        # was die Berechnung rechts ergibt - in dieser Berechnung wird der alte Wert von x verwendet. 
-        x = (x + x1) / 2+        x = (x + xA) / 2
                  
         # Analog fuer die neue y-Koordinate         # Analog fuer die neue y-Koordinate
-        y = (y + y1) / 2+        y = (y + yA) / 2
                  
-        # Hier endet der Befehlsblock, der ausgefuehrt wird, wenn zufall == 1 gilt.+        # Hier endet der eingerückte Befehlsblock, der ausgefuehrt wird, wenn zufall == 1 gilt.
                  
     # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar.     # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar.
     if zufall == 2:     if zufall == 2:
-        x = (x + x2) / 2 +        x = (x + xB) / 2 
-        y = (y + y2) / 2+        y = (y + yB) / 2
     if zufall == 3:      if zufall == 3: 
-        x = (x + x3) / 2         +        x = (x + xC) / 2         
-        y = (y + y3) / 2+        y = (y + yC) / 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))     point(int(x), int(y))
  
-#    Die folgenden Zeilen auskommentieren, wenn man will, dass das Programm langsamer durchgefuehrt wird: +#    Die folgenden Zeilen auskommentieren, wenn man will, dass das Programm anfangs langsamer durchgefuehrt wird: 
-#    delay(42) macht eine Pause von 42 Millisekunden.+#    Beispielsweise macht "delay(42)macht eine Pause von 42 Millisekunden.
 # #
 #    if i < 1000: #    if i < 1000:
Line 180: Line 218:
  
 # Hier endet die for-Schleife, denn der folgende Befehl ist nicht mehr eingerueckt. # 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.") print(iterationen, "Iterationen durchgeführt.")
 </code> </code>
Line 191: 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? 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:+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|}} {{:lehrkraefte:snr:informatik:glf21:python:chaos-game:menu-tigerjython.png?nolink&200|}}
Line 201: Line 244:
 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 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.+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> </WRAP>
- 
- 
      
 +===== Link zur Kursseite =====
 +
 +[[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]
  
  
  
  • lehrkraefte/snr/informatik/glf21/python/chaos-game.1629214951.txt.gz
  • Last modified: 2021/08/17 17:42
  • by Olaf Schnürer