Un beau sapin de Noël en Python

  • Dernière modification de la publication :6 décembre 2021
  • Temps de lecture :4 min de lecture
  • Commentaires de la publication :0 commentaire

Loading

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…

sapin noël python
Sapin de Noël réalisé à l’aide de Python

Parce qu’un sapin pourri du genre:

Sapin de Noël bien pourri

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.

sapin noël python

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 !

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires