Básico · Ângulo de ouro

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

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

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

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

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

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

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

  6. plt.axis("equal")

    A mesma escala nos dois eixos, para que a flor saia redonda e não achatada.

Experimente

  1. Mostre o ângulo de ouro em graus.

    Pista

    np.degrees converte radianos em graus.

    Resposta

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

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

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

1. O que contém np.arange(1, 1001)?
2. Por que razão não há nenhum loop for no script?
3. Em que unidade np.cos e np.sin recebem os ângulos?
4. O que transforma um ângulo θ e uma distância r num ponto?
5. O que se obtém com golden = np.radians(144)?

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.

Estes flashcards numa página à parte →