Lekcja 1: Tablice i kąty
Zbuduj w Pythonie wzór „Złoty kąt” i po drodze naucz się:
- tablice numpy z np.arange
- działania na całej tablicy naraz
- radiany, np.cos i np.sin
- od kąta i odległości do x i y
- wykres punktowy kolorowany wartością
Najpierw obejrzyj
Film gra z YouTube po kliknięciu.
"""Golden angle: seed n at the angle n x 137.5 degrees and the distance sqrt(n) (Vogel, 1979).
Run: python golden-angle.py (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")
n = np.arange(1, 1001) # seed numbers
golden = np.pi * (3 - np.sqrt(5)) # 137.5 degrees in radians: 360 / phi**2
theta, r = n * golden, np.sqrt(n) # the whole rule
x, y = r * np.cos(theta), r * np.sin(theta)
plt.figure(figsize=(6, 6))
plt.scatter(x, y, s=8, c=n, cmap="viridis")
plt.axis("equal")
plt.axis("off")
plt.show()
# Try: golden = np.radians(144) -> five straight spokes (144 degrees is 2/5 of a turn)
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 = np.arange(1, 1001)Tablica liczb od 1 do 1000, po jednej na nasienie. np.arange kończy tuż przed swoim końcem, więc 1001 daje 1000.
golden = np.pi * (3 - np.sqrt(5))Złoty kąt w radianach, jednostce, której używa trygonometria numpy: pełny obrót to 2π. π·(3 − √5) ≈ 2,39996 radiana, czyli 137,5°.
theta, r = n * golden, np.sqrt(n)Działanie na tablicy dotyczy każdego elementu: n * golden to 1000 kątów naraz, np.sqrt(n) to 1000 odległości. Pętla nie jest potrzebna.
x, y = r * np.cos(theta), r * np.sin(theta)Od kąta i odległości (współrzędne biegunowe) do punktu na kartce: x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, s=8, c=n, cmap="viridis")Jedna kropka na nasienie, rozmiar 8, każda w kolorze z mapy kolorów „viridis” według swojego numeru n.
plt.axis("equal")Ta sama skala na obu osiach, więc kwiat wychodzi okrągły, a nie spłaszczony.
Twoja kolej
Wypisz złoty kąt w stopniach.
Podpowiedź
np.degrees zamienia radiany na stopnie.
Odpowiedź
print(np.degrees(golden)) wypisuje 137.50776405003785.
Narysuj tylko pierwszych 100 nasion.
Podpowiedź
Zmień koniec np.arange.
Odpowiedź
n = np.arange(1, 101). Przy 100 nasionach rodziny spiral są dużo trudniejsze do zobaczenia: wzór potrzebuje wielu nasion.
Zrób zewnętrzne nasiona większe od wewnętrznych.
Podpowiedź
s, czyli rozmiar, też może być tablicą.
Odpowiedź
plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"): nasienie 1000 dostaje rozmiar 20, nasienie 50 rozmiar 1.
Quiz
Fiszki
Przeczytaj przód, powiedz sobie, co jest z tyłu, potem otwórz kartę.
np.arange(a, b)
Liczby od a do b, ale bez b, jako tablica numpy.
Kod wektorowy
Działania na całych tablicach naraz zamiast pętli po elementach: krócej i szybciej.
Radiany
Jednostka kąta w np.cos i np.sin: 2π na pełny obrót. np.radians(144) przelicza ze stopni.
Biegunowe na x, y
x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, c=values)
Jedna kropka na punkt; c koloruje każdą według wartości przez mapę kolorów cmap.