Básico · Tabuada no círculo

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

  1. N, k = 200, 2

    Dois nomes de uma vez: 200 pontos e o multiplicador 2. São estes os dois números a mudar.

  2. start = 2 * np.pi * np.arange(N) / N

    O ângulo de cada ponto: o ponto n fica em 2π·n / N, por isso os 200 pontos repartem o círculo por igual.

  3. end = start * k

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

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

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

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

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

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

1. O que dá zip(start, end) ao loop a cada volta?
2. Quanto é 300 % 200 em Python?
3. Por que razão o script nunca usa %?
4. Em plt.plot([x1, x2], [y1, y2]), o que vem primeiro?
5. Que curva desenha vezes 2?

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.

Estes flashcards numa página à parte →