Einstieg · Einmaleins auf dem Kreis

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.py
"""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

  1. N, k = 200, 2

    Zwei Namen auf einmal: 200 Punkte und der Faktor 2. Das sind die beiden Zahlen zum Ändern.

  2. start = 2 * np.pi * np.arange(N) / N

    Der Winkel jedes Punktes: Punkt n sitzt bei 2π·n / N, also teilen sich die 200 Punkte den Kreis gleichmäßig.

  3. end = start * k

    Der 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.

  4. 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.

  5. 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

  1. 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.

  2. 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.

  3. 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

1. Was gibt zip(start, end) der Schleife bei jedem Durchlauf?
2. Was ist 300 % 200 in Python?
3. Warum verwendet das Skript nie %?
4. Was kommt in plt.plot([x1, x2], [y1, y2]) zuerst?
5. Welche Kurve zeichnet mal 2?

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.

Diese Lernkarten auf einer eigenen Seite →