Lição 1: Arrays e ângulos
Construa em Python o padrão “Ângulo de ouro” e aprenda pelo caminho:
- arrays numpy com np.arange
- contas sobre um array inteiro de uma só vez
- radianos, np.cos e np.sin
- de um ângulo e uma distância para x e y
- um gráfico de pontos com cores segundo um valor
Veja-o primeiro
É reproduzido a partir do YouTube depois de um clique.
"""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)
Não tem Python neste computador? O notebook executa o mesmo script, os exercícios e as respostas no navegador, no Google Colab. O notebook está em inglês.
Linha a linha
n = np.arange(1, 1001)Um array com os números de 1 a 1000, um por semente. np.arange para logo antes do seu fim, por isso 1001 dá 1000.
golden = np.pi * (3 - np.sqrt(5))O ângulo de ouro em radianos, a unidade que a trigonometria do numpy usa: uma volta completa é 2π. π·(3 − √5) ≈ 2,39996 radianos, ou seja, 137,5°.
theta, r = n * golden, np.sqrt(n)Uma conta sobre um array aplica-se a cada elemento: n * golden são 1000 ângulos de uma vez, np.sqrt(n) 1000 distâncias. Não é preciso nenhum loop.
x, y = r * np.cos(theta), r * np.sin(theta)De um ângulo e uma distância (coordenadas polares) para um ponto na página: x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, s=8, c=n, cmap="viridis")Um ponto por semente, de tamanho 8, cada um com uma cor do mapa de cores “viridis” segundo o seu número n.
plt.axis("equal")A mesma escala nos dois eixos, para que a flor saia redonda e não achatada.
Experimente
Mostre o ângulo de ouro em graus.
Pista
np.degrees converte radianos em graus.
Resposta
print(np.degrees(golden)) mostra 137.50776405003785.
Desenhe só as primeiras 100 sementes.
Pista
Mude o fim de np.arange.
Resposta
n = np.arange(1, 101). Com apenas 100 sementes, as famílias de espirais são muito mais difíceis de ver: o padrão precisa de muitas sementes.
Faça as sementes de fora maiores do que as de dentro.
Pista
s, o tamanho, também pode ser um array.
Resposta
plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"): a semente 1000 fica com tamanho 20, a semente 50 com tamanho 1.
Quiz
Flashcards
Leia a frente, tente recordar o verso e só depois abra o cartão.
np.arange(a, b)
Os números de a até b, mas sem incluir b, como array numpy.
Código vetorizado
Contas sobre arrays inteiros de uma só vez em vez de um loop pelos elementos: mais curto e mais rápido.
Radianos
A unidade de ângulo de np.cos e np.sin: 2π para uma volta completa. np.radians(144) converte a partir de graus.
De polares para x, y
x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, c=values)
Uma marca por ponto; c dá a cada uma a sua cor segundo um valor, através do mapa de cores cmap.