Pour illustrer cette période de Noël, et pour rester tout de même dans la thématique de mon site, rien de tel qu’un code Python pour faire un beau sapin de Noël…
Parce qu’un sapin pourri du genre:
non merci!
Moi, je voulais un beau sapin de Noël en Python ! Je me suis donc mis à fouiller Internet, et je suis tombé sur la page https://perso.crans.org/besson/infoMP/TPs/solutions/_modules/sapinNoel.html. Malheureusement, le script ne fonctionne pas totalement… L’auteur nous promet une animation, mais quand on lance le script, l’animation ne se crée pas car la partie concernant l’animation est a priori obsolète. Et j’ai beau chercher, je ne trouve pas comment modifier simplement ce script pour faire clignoter les boules.
J’ai donc épuré le script afin qu’il dessine au moins un arbre statique, et cela donne :
""" Script original : Arnaud Basson - URL : https://perso.crans.org/besson/infoMP/TPs/solutions/sapinNoel.html - *Date :* Noël 2015 ! (24 décembre 2015), - *Licence :* MIT Licence (http://lbesson.mit-license.org). """ import numpy as np import matplotlib.pyplot as plt import matplotlib.collections as coll def simil(u, v): b = u a = 1j*(u-v) def f(z): return a * z + b return f f1 = simil(0.2j, 0.2j + 0.5*np.exp(1j*np.pi/7)) f2 = simil(0.22j, 0.22j + 0.45j*np.exp(1j*60*np.pi/180)) f3 = simil(0.55j, 0.55j + 0.35*np.exp(1j*30*np.pi/180)) f4 = simil(0.57j, 0.57j + 0.3j*np.exp(1j*np.pi/3)) f5 = simil(0.7j, 1.2j-0.01) def iterer(n): L = [0, 0.7j] L1 = L[:] for _ in range(n): L2 = [] for f in [f1, f2, f3, f4, f5]: L2.extend([f(z) for z in L1]) L.extend(L2) L1 = L2 return L def tracer(n): L = iterer(n) pts = [(z.real, z.imag) for z in L] fig = plt.figure() segments = coll.LineCollection(zip(pts[::2], pts[1::2]), color='darkgreen') ax = plt.gca() ax.add_collection(segments) nb = 30 l = len(L) p = l//nb if l >= nb else 1 x = [z.real for z in L[1::p]] y = [z.imag for z in L[1::p]] couleurs = ['red', 'blue', 'yellow'] c = [couleurs[k % len(couleurs)] for k in range(len(x))] sca = plt.scatter(x, y, s=60, c=c, zorder=2) plt.axis('equal') plt.ylim(0, 1.45) plt.xticks([]) plt.yticks([]) plt.show() tracer(7)
Si vous avez une suggestion pour créer une animation, n’hésitez-pas à la proposer !