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 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
N, k = 200, 2Deux noms d’un coup : 200 points et le multiplicateur 2. Ce sont les deux nombres à changer.
start = 2 * np.pi * np.arange(N) / NL’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.
end = start * kL’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.
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.
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
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.
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.
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
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.