Un beau sapin de Noël en Python

Un beau sapin de Noël en Python

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 uh beau sapin de Noël… Mais là, je ne vous parle pas du sapin pourri du genre:

Sapin de Noël bien pourri

Non, moi, je voulais un beau sapin ! 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 épurer 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 !

Evariste_Galois1973

Laissez votre message

Supportscreen tag