Leçon 1 : Tableaux et angles
Construis en Python le motif « Angle d’or » et apprends en chemin :
- des tableaux numpy avec np.arange
- des calculs sur tout un tableau d’un coup
- les radians, np.cos et np.sin
- d’un angle et d’une distance à x et y
- un nuage de points coloré selon une valeur
Regarde-le d’abord
Lecture depuis YouTube après un clic.
"""Golden angle: seed n at the angle n x 137.5 degrees and the distance sqrt(n) (Vogel, 1979).
Run: python golden-angle.py (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")
n = np.arange(1, 1001) # seed numbers
golden = np.pi * (3 - np.sqrt(5)) # 137.5 degrees in radians: 360 / phi**2
theta, r = n * golden, np.sqrt(n) # the whole rule
x, y = r * np.cos(theta), r * np.sin(theta)
plt.figure(figsize=(6, 6))
plt.scatter(x, y, s=8, c=n, cmap="viridis")
plt.axis("equal")
plt.axis("off")
plt.show()
# Try: golden = np.radians(144) -> five straight spokes (144 degrees is 2/5 of a turn)
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 = np.arange(1, 1001)Un tableau des nombres de 1 à 1000, un par graine. np.arange s’arrête juste avant sa fin, donc 1001 donne 1000.
golden = np.pi * (3 - np.sqrt(5))L’angle d’or en radians, l’unité qu’utilise la trigonométrie de numpy : un tour complet vaut 2π. π·(3 − √5) ≈ 2,39996 radians, soit 137,5°.
theta, r = n * golden, np.sqrt(n)Un calcul sur un tableau s’applique à chaque élément : n * golden donne 1000 angles d’un coup, np.sqrt(n) 1000 distances. Pas besoin de boucle.
x, y = r * np.cos(theta), r * np.sin(theta)D’un angle et d’une distance (les coordonnées polaires) à un point sur la page : x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, s=8, c=n, cmap="viridis")Un point par graine, de taille 8, chacun coloré selon son numéro n avec la palette de couleurs « viridis ».
plt.axis("equal")La même échelle sur les deux axes, pour que la fleur soit ronde et non écrasée.
À toi de jouer
Affiche l’angle d’or en degrés.
Indice
np.degrees convertit les radians en degrés.
Réponse
print(np.degrees(golden)) affiche 137.50776405003785.
Dessine seulement les 100 premières graines.
Indice
Change la fin de np.arange.
Réponse
n = np.arange(1, 101). Avec seulement 100 graines, les familles de spirales sont beaucoup plus difficiles à voir : le motif a besoin de beaucoup de graines.
Rends les graines extérieures plus grosses que celles de l’intérieur.
Indice
s, la taille, peut aussi être un tableau.
Réponse
plt.scatter(x, y, s=n / 50, c=n, cmap="viridis") : la graine 1000 prend la taille 20, la graine 50 la taille 1.
Quiz
Cartes mémoire
Lis le recto, dis-toi le verso, puis retourne la carte.
np.arange(a, b)
Les nombres de a jusqu’à b, sans b, sous forme de tableau numpy.
Code vectorisé
Des calculs sur des tableaux entiers d’un coup au lieu d’une boucle sur les éléments : plus court et plus rapide.
Radians
L’unité d’angle de np.cos et np.sin : 2π pour un tour complet. np.radians(144) convertit depuis les degrés.
Des polaires à x, y
x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, c=values)
Un point dessiné par donnée ; c colore chacun selon une valeur à travers la palette de couleurs cmap.