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 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
N, k = 200, 2Dwie nazwy naraz: 200 punktów i mnożnik 2. To te dwie liczby będziesz zmieniać.
start = 2 * np.pi * np.arange(N) / NKą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.
end = start * kKą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).
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.
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
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.
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.
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
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.