Grundlagen mit Turtle
Grundidee: Ein Schildkröte (Turtle) befindet sich auf dem Bildschirm an einer bestimmten Position $(x,y)$ und schaut in eine bestimmte Richtung (festgelegt durch einen Winkel $\alpha$ wie im Einheitskreis).
Die Turtle kann sich vorwärts bewegen (forward
) dabei zeichnen (oder nicht mit move
) und sich drehen mit left
oder right
.
Damit können recht einfach spannende Grafiken gezeichnet werden.
Setup
Legen Sie einen neuen Ordner an (z.B. mit dem Namen 'turtle').
Speichern Sie darin folgende minimale Turtleklasse: kroete.py
Speichern Sie im gleichen Ordner folgendes Test-Programm: turtletest.py
Testen Sie das Test-Programm und versuchen Sie es zu verstehen.
Mathematik hinter der Turtle
Soll von einem Punkt $(x,y)$ weiter in die Richtung vom Winkel $\alpha$ gegangen werden, muss also in die Richtung vom Vektor $\begin{pmatrix}\cos(\alpha)\\ \sin(\alpha) \end{pmatrix}$ gegangen werden. Dieser Vektor entspricht der Verschiebung des Nullpunkts zum Punk $P_{\alpha}$ auf dem Einheitskreis.
Wenn die Schrittlänge $r$ ist, reicht es, beide Einträge vom Vektor mit $r$ zu multiplizieren. Der neue Punkt hat also die Koordinaten $$ \left(x + r \cdot \cos(\alpha),\,\, y+ r \cdot \sin(\alpha)\right) $$
Finden Sie den der obigen Formel ensprechenden Python-Code in der Datei kroete.py
.
Aufgaben
- Ändern Sie den Code in
turtletest.py
so ab, dass anstatt des Dreiecks ein blaues Quadrat gezeichnet wird.
For-Schlaufen
Mit For-Schlaufen werden Programmblöcke wiederholt. Dabei wird eine Laufvariable hochgezählt (bzw. läuft die Werte in einer Liste durch).
for i in range(10): # 10 Wiederholungen, i läuft von 0 bis und mit 9 print(i) if i%2 == 0: # i%2 ist der Rest der Division durch zwei, also 0 oder 1. print("gerade") print("Das wird nicht wiederholt")
Schreiben Sie je ein Programm mit For-Schleifen, das mit der Turtle folgende Dinge zeichnet:
- Ein regelmässiges 12-Eck
- Ein 5-Zack-Stern
- Ein regelmässiges $n$-Eck, wobei $n$ als Variable am Anfang im Code festgelegt werden kann.
- Ein $n$-Zack-Stern, wobei $n$ als Variable am Anfang im Code festgelegt werden kann.
- Bonus-Aufgabe: Zentrieren Sie das $n$-Eck bzw. den $n$-Zack-Stern.
Für die Bonus-Aufgabe wird wohl der Radius vom $n$-Eck benötigt (oder umgekehrt die Seitenlänge aus dem Radius berechnet). Dazu werden die trigonometrischen Funktionen gebraucht:
# Die Funktionen Cosinus und Sinus sowie die Konstante pi importieren from math import cos,sin,pi w=30 print(f"cos({w})={cos(w/180*pi)}, sin({w})={sin(w/180*pi)}")
Funktionen
Wie bereits gesehen, bieten sich Funktionen an, ein Programm in kleine Unterprogramme zu zerlegen.
Funktionen können (müssen aber nicht) mit return
Werte zurückgeben. Ein return
beendet die Funktion sofort.
Funktionen können beliebig viele Parameter (bzw. Argumente) entgegennehmen.
Beispiel:
from kroete import Kroete # Definition der Funktion quadrat, wird nicht direkt ausgeführt. def quadrat(schildi, s): """Zeichnet ein Quadrat mit der Turtle schildi und Seitenlänge s""" for i in range(4): schildi.forward(s) schildi.left(90) t = Kroete() # Aufruf der Funktion. schildi wird dann zu t, s zu 200 quadrat(t, 200)
Mit Hilfe der oben definierten Funktion quadrat
erstellen Sie (in ungefähr) folgendes Bild (lässt sich in etwa 3 zusätzlichen Zeilen realisieren):
Oder mit einer zusätzlichen Zeile kann noch die Farbe berechnet werden, mit t.rgb(rot, gruen, blau)
, wobei rot
, gruen
und blau
ganze Zahlen zwischen 0 und 255 sind:
Kreis
Folgende Funktion zeichnet Kreise wobei der Mittelpunkt der aktuellen Position der Turtle entspricht:
def kreis(schildi, r): schildi.save() # Zustand speichern n = int(r) # Anzahl Segmente w = 2*pi/n # Winkelschritt s = r*sqrt(sin(w)**2+(1-cos(w))**2) # Segmentlänge schildi.move(r) schildi.left(90) for i in range(n): schildi.forward(s) schildi.left(360/n) schildi.restore() # Zustand wieder herstellen
- Mathematisch gesprochen, was genau zeichnet die Funktion Kreis?
- Was genau ist die Segmentlänge und woher kommt diese Formel? Begründen Sie mit einer guten Skizze (Die Herleitung gäbe ein wunderbare Trigo-Prüfungsaufgabe).
Rekursion
Rekursion nennt man etwas, das mit sich selbst definiert wird (plus noch etwas, um zu beginnen). In der Informatik heisst das meist, dass sich eine Funktion selbst wieder aufruft. Dabei muss natürlich peinlichst darauf geachtet werden, dass sich die Funktion nicht unendlich oft selbst wieder aufruft.
Koch-Kurve
Die Koch-Kurve ist eine rekursiv definierte Kurve.
- Auf Stufe 0 ist die Kurve einfach eine Gerade
- Auf Stufe 1 ist die Kurve aus 4 gleich langen Geradenstücken aufgebaut, mit entsprechenden Winkeln
- Auf Stufe $n$ besteht die Kurve 4 Stücken der Stufe $n-1$, mit entsprechenden Winkeln dazwischen.
- Schreiben und testen Sie eine Funktion
koch0
, die eine Koch-Kurve der Stufe 0 zeichnet, also einfach eine Gerade. Als Argumente nimmt die Funktion eine Turtle und die Gesamtlänge entgegen. - Schreiben und testen Sie eine Funktion
koch1
, die eine Koch-Kurve der Stufe 1 zeichnet und dabei die Funktionkoch0
aufruft. Als Argument nimmt die Funktion eine Turtle und die die Gesamtlänge entgegen. Die Länge einerkoch0
-«Kurve» muss dann aus der Gesamtlänge berechnet werden. - Schreiben Sie dann eine Funktion
koch2
, die eine Koch-Kurve der Stufe 2 zeichnet (und die natürlich die Funktionkoch1
benutzt). Ebenfalls gleiche Argumente. - Wie unterscheiden sich die Funktionen
koch2
undkoch1
? - Anstatt jetzt noch eine Funktion
koch3
zu schreiben, schreiben Sie eine Funktionkoch
, die einen zusätzlichen Parameterstufe
entgegen nimmt. Ist diestufe
Null, wird ein einzelner Strich gezeichnet und dann die Funktion mitreturn
beendet. Ansonsten wird 4 mal die Funktionkoch
mitstufe-1
aufgerufen und dazwischen entsprechend gedreht. - Zusatzaufgabe: Zeichnen Sie 3 Koch-Kurven auf einem gleichseitigen Dreieck, dass damit die «Kochschneeflocke» entsteht.
Pythagorasbaum
Um diesen Baum zu zeichnen, erstellen Sie erst eine Funktion element
, die folgendes Bild zeichnet:
Die Funktion nimmt folgende Parameter entgegen:
- Eine Turtle
t
. Diese legt die Richtung und die Länge vom Quadrat alst.r
fest. - Einen Winkel
w
, der dem «linken» Winkel des rechtwinkligen Dreiecks entspricht. - Die Turtle startet bei «Start» und muss am Ende bei «Ende» sein. Die Schrittlänge
t.r
soll am Schluss unverändert sein. - Sie können dazu auch die Turtle-Methoden
save
undrestore
verwenden, um sich die Position und Zustand der Turtle zu merken.
Hinweis: Sie können die Kathetenlängen mit trigonometrischen Funktionen aus w
und t.r
berechnen.
Erweitern Sie Ihre Funktion so, dass ein zusätzlicher Parameter stufe
entgegengenommen wird.
- Ist die
stufe
Null, macht die Funktion immer noch das genau gleiche. - Sonst wird anstelle des Zeichnens der Katheten die Funktion selbst mit
stufe-1
aufgerufen, der Rest bleibt sich geich. - Probieren Sie verschiedene Winkel aus.
- Anstatt die
stufe
als Abbruchkriterium zu verwenden, verwenden Siet.r
, d.h. sobald die zu zeichnende Strecke z.B. kleiner als 3 ist, wird abgebrochen. So werden alle Äste bis zu einer sinnvollen Tiefe gezeichnet. - Man erhält einen interessanten Baum, wenn man statt einen konstanten Winkel
w
zu verwenden, zwischenw
und90-w
abwechselt, bzw. den je nach Stufe anpasst (z.B. als Schwingung )