Lektion 2: Schleifen und Reste
Baue das Muster „Einmaleins auf dem Kreis“ in Python und lerne dabei:
- eine for-Schleife über Paare mit zip
- der Rest % und Winkel, die wieder herumlaufen
- eine Linie aus zwei Punkten mit plt.plot
- Erkunden durch Ändern eines Parameters
Erst ansehen
Läuft nach einem Klick von YouTube.
"""Times table on a circle: N dots, each dot n joined to dot (k * n) mod N.
Run: python times-table.py (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")
N, k = 200, 2 # the number of dots and the multiplier
start = 2 * np.pi * np.arange(N) / N # dot n at the angle 2*pi*n/N
end = start * k # dot k*n: angles wrap around the circle by themselves (that is the "mod N")
plt.figure(figsize=(6, 6))
for a, b in zip(start, end):
plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)
plt.axis("equal")
plt.axis("off")
plt.show()
# Try: k = 3 for the nephroid, k = 101 to see it collapse into diameters
Kein Python auf diesem Computer? Das Notebook führt dasselbe Skript, die Übungen und die Lösungen in deinem Browser aus, in Google Colab. Das Notebook ist auf Englisch.
Zeile für Zeile
N, k = 200, 2Zwei Namen auf einmal: 200 Punkte und der Faktor 2. Das sind die beiden Zahlen zum Ändern.
start = 2 * np.pi * np.arange(N) / NDer Winkel jedes Punktes: Punkt n sitzt bei 2π·n / N, also teilen sich die 200 Punkte den Kreis gleichmäßig.
end = start * kDer Winkel von Punkt k·n. Ein Winkel über 2π läuft einfach noch einmal herum, und das erledigt das Zurückfalten (k·n mod N) für uns.
for a, b in zip(start, end):zip bildet Paare aus den beiden Arrays: Bei jedem Durchlauf bekommt die Schleife einen Startwinkel mit seinem Endwinkel.
plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)plt.plot nimmt die x-Werte, dann die y-Werte der beiden Enden der Linie: eine Sehne des Kreises pro Durchlauf.
Probier es selbst
Zeichne mal 3 und mal 4. Wie viele Spitzen hat jede Kurve?
Hinweis
Ändere k.
Lösung
Mal 3 ergibt die Nephroide mit 2 Spitzen, mal 4 eine Kurve mit 3: immer k − 1.
Auf welchem Punkt landet 150 × 2 bei 200 Punkten? Rechne es mit dem Restoperator aus.
Hinweis
In Python gibt % den Rest nach dem Teilen.
Lösung
(150 * 2) % 200 ist 100.
Nimm 20 Punkte statt 200. Warum ist das Herz schwerer zu sehen?
Hinweis
Ändere N.
Lösung
Bei 20 Punkten gibt es nur 20 Linien, zu wenige, damit die Kurve sichtbar wird, die sie alle berühren.
Quiz
Lernkarten
Lies die Vorderseite, sag dir die Rückseite vor, dann öffne die Karte.
zip(a, b)
Bildet Paare aus zwei Folgen, Element für Element: (a[0], b[0]), (a[1], b[1]), …
x % n
Der Rest von x geteilt durch n: 300 % 200 ist 100.
plt.plot([x1, x2], [y1, y2])
Eine Linie von (x1, y1) nach (x2, y2).
Einhüllende
Die Kurve, die jede Linie einer Familie gerade berührt: hier die Kardioide.
Mal k auf einem Kreis
Ein ganzzahliger Faktor k zeichnet eine Kurve mit k − 1 Spitzen.