Principiante · Tabla de multiplicar en un círculo

Lección 2: Bucles y restos

Construye en Python el patrón «Tabla de multiplicar en un círculo» y aprende por el camino:

  • un bucle for sobre parejas con zip
  • el resto % y los ángulos que dan la vuelta
  • una línea entre dos puntos con plt.plot
  • explorar cambiando un solo parámetro

Míralo primero

Se reproduce desde YouTube tras hacer clic.

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

¿No tienes Python en este equipo? El cuaderno ejecuta el mismo script, los ejercicios y las respuestas en tu navegador, en Google Colab. El cuaderno está en inglés.

Línea a línea

  1. N, k = 200, 2

    Dos nombres a la vez: 200 puntos y el multiplicador 2. Son los dos números que hay que cambiar.

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

    El ángulo de cada punto: el punto n está en 2π·n / N, así que los 200 puntos se reparten el círculo por igual.

  3. end = start * k

    El ángulo del punto k·n. Un ángulo mayor que 2π simplemente vuelve a dar la vuelta, y eso hace por nosotros la reducción (k·n mod N).

  4. for a, b in zip(start, end):

    zip empareja los dos arrays: en cada vuelta, el bucle recibe un ángulo de inicio con su ángulo final.

  5. plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)

    plt.plot recibe los valores x y luego los valores y de los dos extremos de la línea: una cuerda del círculo en cada vuelta.

Pruébalo tú

  1. Dibuja por 3 y por 4. ¿Cuántas cúspides (puntas) tiene cada curva?

    Pista

    Cambia k.

    Respuesta

    Por 3 da la nefroide, con 2 cúspides; por 4, una curva con 3: siempre k − 1.

  2. Con 200 puntos, ¿en qué punto cae 150 × 2? Calcúlalo con el operador de resto.

    Pista

    En Python, % da el resto de la división.

    Respuesta

    (150 * 2) % 200 es 100.

  3. Usa 20 puntos en lugar de 200. ¿Por qué cuesta más ver el corazón?

    Pista

    Cambia N.

    Respuesta

    Con 20 puntos solo hay 20 líneas, demasiado pocas para que se vea la curva que todas tocan.

Cuestionario

1. ¿Qué le da zip(start, end) al bucle en cada vuelta?
2. ¿Cuánto es 300 % 200 en Python?
3. ¿Por qué el script nunca usa %?
4. En plt.plot([x1, x2], [y1, y2]), ¿qué va primero?
5. ¿Qué curva dibuja por 2?

Tarjetas de repaso

Lee el anverso, di el reverso para ti y luego abre la tarjeta.

  • zip(a, b)

    Empareja dos secuencias elemento a elemento: (a[0], b[0]), (a[1], b[1]), …

  • x % n

    El resto de dividir x entre n: 300 % 200 es 100.

  • plt.plot([x1, x2], [y1, y2])

    Una línea de (x1, y1) a (x2, y2).

  • Envolvente

    La curva que todas las líneas de una familia apenas tocan: aquí, la cardioide.

  • Por k en un círculo

    Un multiplicador entero k dibuja una curva con k − 1 cúspides.

Estas tarjetas en su propia página →