Dla początkujących · Złoty kąt

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

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

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

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

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

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

  6. plt.axis("equal")

    Ta sama skala na obu osiach, więc kwiat wychodzi okrągły, a nie spłaszczony.

Twoja kolej

  1. Wypisz złoty kąt w stopniach.

    Podpowiedź

    np.degrees zamienia radiany na stopnie.

    Odpowiedź

    print(np.degrees(golden)) wypisuje 137.50776405003785.

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

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

1. Co zawiera np.arange(1, 1001)?
2. Dlaczego w skrypcie nie ma pętli for?
3. W jakiej jednostce np.cos i np.sin przyjmują kąty?
4. Co zamienia kąt θ i odległość r na punkt?
5. Co dostaniesz przy golden = np.radians(144)?

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.

Te fiszki na osobnej stronie →