Lição 2: Loops e restos
Construa em Python o padrão “Tabuada no círculo” e aprenda pelo caminho:
- um loop for sobre pares com zip
- o resto % e ângulos que dão a volta
- uma linha a partir de dois pontos com plt.plot
- explorar mudando um só parâmetro
Veja-o primeiro
É reproduzido a partir do YouTube depois de um clique.
"""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
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, k = 200, 2Dois nomes de uma vez: 200 pontos e o multiplicador 2. São estes os dois números a mudar.
start = 2 * np.pi * np.arange(N) / NO ângulo de cada ponto: o ponto n fica em 2π·n / N, por isso os 200 pontos repartem o círculo por igual.
end = start * kO ângulo do ponto k·n. Um ângulo para lá de 2π simplesmente dá outra volta, e isso faz por nós a redução (k·n mod N).
for a, b in zip(start, end):zip emparelha os dois arrays: a cada volta, o loop recebe um ângulo de partida com o seu ângulo de chegada.
plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)plt.plot recebe os valores de x e depois os valores de y das duas pontas da linha: uma corda do círculo a cada volta.
Experimente
Desenhe vezes 3 e vezes 4. Quantas cúspides (pontas agudas) tem cada curva?
Pista
Mude k.
Resposta
Vezes 3 dá a nefroide, com 2 cúspides, vezes 4 uma curva com 3: sempre k − 1.
Com 200 pontos, em que ponto cai 150 × 2? Calcule-o com o operador de resto.
Pista
Em Python, % dá o resto da divisão.
Resposta
(150 * 2) % 200 é 100.
Use 20 pontos em vez de 200. Por que razão o coração se vê pior?
Pista
Mude N.
Resposta
Com 20 pontos há só 20 linhas, poucas demais para se ver a curva que todas tocam.
Quiz
Flashcards
Leia a frente, tente recordar o verso e só depois abra o cartão.
zip(a, b)
Emparelha duas sequências elemento a elemento: (a[0], b[0]), (a[1], b[1]), …
x % n
O resto de x dividido por n: 300 % 200 é 100.
plt.plot([x1, x2], [y1, y2])
Uma linha de (x1, y1) até (x2, y2).
Envolvente
A curva que cada linha de uma família apenas toca: aqui, a cardioide.
Vezes k num círculo
Um multiplicador inteiro k desenha uma curva com k − 1 cúspides.