Débutant · Table de multiplication sur un cercle

Leçon 2 : Boucles et restes

Construis en Python le motif « Table de multiplication sur un cercle » et apprends en chemin :

  • une boucle for sur des paires avec zip
  • le reste % et les angles qui font le tour
  • une ligne entre deux points avec plt.plot
  • explorer en changeant un seul paramètre

Regarde-le d’abord

Lecture depuis YouTube après un 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

Pas de Python sur cet ordinateur ? Le notebook exécute le même script, les exercices et les réponses dans ton navigateur, sur Google Colab. Le notebook est en anglais.

Ligne par ligne

  1. N, k = 200, 2

    Deux noms d’un coup : 200 points et le multiplicateur 2. Ce sont les deux nombres à changer.

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

    L’angle de chaque point : le point n se trouve à 2π·n / N, donc les 200 points se partagent le cercle de façon régulière.

  3. end = start * k

    L’angle du point k·n. Un angle au-delà de 2π refait simplement un tour, et cela fait le repli (k·n mod N) à notre place.

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

    zip met les deux tableaux en paires : à chaque tour, la boucle reçoit un angle de départ avec son angle d’arrivée.

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

    plt.plot prend les valeurs x, puis les valeurs y, des deux extrémités de la ligne : une corde du cercle à chaque tour.

À toi de jouer

  1. Dessine fois 3 et fois 4. Combien de points de rebroussement (pointes) a chaque courbe ?

    Indice

    Change k.

    Réponse

    Fois 3 donne la néphroïde à 2 points de rebroussement, fois 4 une courbe à 3 : toujours k − 1.

  2. Avec 200 points, sur quel point tombe 150 × 2 ? Calcule-le avec l’opérateur de reste.

    Indice

    En Python, % donne le reste de la division.

    Réponse

    (150 * 2) % 200 vaut 100.

  3. Utilise 20 points au lieu de 200. Pourquoi le cœur est-il plus difficile à voir ?

    Indice

    Change N.

    Réponse

    Avec 20 points, il n’y a que 20 lignes, trop peu pour que la courbe qu’elles touchent toutes apparaisse.

Quiz

1. Que donne zip(start, end) à la boucle à chaque tour ?
2. Que vaut 300 % 200 en Python ?
3. Pourquoi le script n’utilise-t-il jamais % ?
4. Dans plt.plot([x1, x2], [y1, y2]), qu’est-ce qui vient en premier ?
5. Quelle courbe dessine fois 2 ?

Cartes mémoire

Lis le recto, dis-toi le verso, puis retourne la carte.

  • zip(a, b)

    Met deux séquences en paires, élément par élément : (a[0], b[0]), (a[1], b[1]), …

  • x % n

    Le reste de la division de x par n : 300 % 200 vaut 100.

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

    Une ligne de (x1, y1) à (x2, y2).

  • Enveloppe

    La courbe que chaque ligne d’une famille touche tout juste : ici, la cardioïde.

  • Fois k sur un cercle

    Un multiplicateur entier k dessine une courbe à k − 1 points de rebroussement.

Ces cartes mémoire sur une page à part →