# 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.")