Dla początkujących · Tabliczka mnożenia na okręgu

Lekcja 2: Pętle i reszty z dzielenia

Zbuduj w Pythonie wzór „Tabliczka mnożenia na okręgu” i po drodze naucz się:

  • pętla for po parach z zip
  • reszta z dzielenia % i kąty, które zawijają się dookoła
  • odcinek z dwóch punktów przez plt.plot
  • odkrywanie przez zmianę jednego parametru

Najpierw obejrzyj

Film gra z YouTube po kliknięciu.

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

Nie masz Pythona na tym komputerze? Notatnik uruchamia ten sam skrypt, zadania i odpowiedzi w przeglądarce, w Google Colab. Notatnik jest po angielsku.

Linijka po linijce

  1. N, k = 200, 2

    Dwie nazwy naraz: 200 punktów i mnożnik 2. To te dwie liczby będziesz zmieniać.

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

    Kąt każdego punktu: punkt n leży pod kątem 2π·n / N, więc 200 punktów dzieli okrąg po równo.

  3. end = start * k

    Kąt punktu k·n. Kąt większy niż 2π po prostu obchodzi okrąg jeszcze raz, i to za nas robi zawijanie (k·n mod N).

  4. for a, b in zip(start, end):

    zip łączy dwie tablice w pary: przy każdym obrocie pętla dostaje jeden kąt początku z jego kątem końca.

  5. plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)

    plt.plot bierze wartości x, a potem wartości y obu końców odcinka: jedna cięciwa okręgu przy każdym obrocie pętli.

Twoja kolej

  1. Narysuj razy 3 i razy 4. Ile ostrzy (ostrych czubków) ma każda krzywa?

    Podpowiedź

    Zmień k.

    Odpowiedź

    Razy 3 daje nefroidę z 2 ostrzami, razy 4 krzywą z 3: zawsze k − 1.

  2. Przy 200 punktach w który punkt trafia 150 × 2? Policz to operatorem reszty z dzielenia.

    Podpowiedź

    W Pythonie % daje resztę z dzielenia.

    Odpowiedź

    (150 * 2) % 200 to 100.

  3. Użyj 20 punktów zamiast 200. Dlaczego serce trudniej zobaczyć?

    Podpowiedź

    Zmień N.

    Odpowiedź

    Przy 20 punktach jest tylko 20 linii, za mało, żeby pokazała się krzywa, której wszystkie dotykają.

Quiz

1. Co zip(start, end) daje pętli przy każdym obrocie?
2. Ile wynosi 300 % 200 w Pythonie?
3. Dlaczego skrypt w ogóle nie używa %?
4. Co jest pierwsze w plt.plot([x1, x2], [y1, y2])?
5. Jaką krzywą rysuje razy 2?

Fiszki

Przeczytaj przód, powiedz sobie, co jest z tyłu, potem otwórz kartę.

  • zip(a, b)

    Łączy dwa ciągi element po elemencie: (a[0], b[0]), (a[1], b[1]), …

  • x % n

    Reszta z dzielenia x przez n: 300 % 200 to 100.

  • plt.plot([x1, x2], [y1, y2])

    Odcinek od (x1, y1) do (x2, y2).

  • Obwiednia

    Krzywa, której każda linia z rodziny tylko dotyka: tutaj kardioida.

  • Razy k na okręgu

    Całkowity mnożnik k rysuje krzywą z k − 1 ostrzami.

Te fiszki na osobnej stronie →