python/SpiraleRectangle/main/spirale_rectangle.py

113 lines
3.6 KiB
Python
Raw Normal View History

2022-07-25 09:31:30 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
### Spirale rectangulaire
Ce petit tas de codes permet de simuler une spirale carrée en rotation.
Il a été créé pour *Spyder* 3.3.1, sous *Ubuntu* 16.04.5.
@organization: Alnotz Corp.
@author: Alnotz
@date: 02/09/2018
@version: 0.1
@copyright: GNU General Public License 3
"""
# Outils graphiques
from matplotlib.pyplot import figure, \
plot, \
pause, \
xlim, \
ylim, \
show, \
close, \
savefig
# Outils d'analyse numérique.
from numpy import array, sqrt, complex
# Racine du projet.
root = "projet_spirale_rectangle/"
# Données images en format PNG. Chez moi, de script s'exécute
#depuis le répertoire `./main`.
data = "../data/"
a = 1#Coté.
# Suite complexe à construire. Retourne un vecteur complexe.
def suite():
"""
#### Fonction suite
Renvoie un tableau 1D de la suite complexe *droite*.
Ce tableau permettra de trace la première spirale retangle.
"""
z = complex(0,0)# Nombre complexe initial.
Z = [z]# Début de suite.
for n in range(0, 20):# Calcul récursif des termes suivants.
z = z + complex(0, 1)**n * 2**(-n/2 + 1/2) * a
Z = Z + [z]
return array(Z)
# Construction des courbes, animation et enregistrement.
def graph():
"""
#### Fonction graph
Fonction principale.
Elle cumule trois actions :
* Construire les spirales rectangles *obliques*;
* Illustrer la séquence d'images;
* Enregistrer sous format PNG.
À la fin, la fenêtre se ferme.
"""
# C'est pour faire un joli texte interactif.
from sys import stdout
fig = figure("Graphe: aperçu")# Graphe à animer.
N = 40# Nombre d'images: 40
Z0 = suite()# Spirale rectangle "droite".
print("", end="\n")
for t in range(1*N + 1):# Animation sur 40 images PNG.
fig.clf()# Graphe nettoyé.
c1 = t/N
c1 = c1 - int(c1)
z = complex(0, (1-c1) * 2)
Z = [z]# Construction de la prochaine spirale en 20 points.
for n in range(0, 20):# Termes complexes de la spirale
# "oblique".
z = z + c1 * 2**((1-n) / 2) \
* complex(0, 1)**n + (1-c1) * 2**((2-n) / 2) \
* complex(0, 1)**(n-1)
Z += [z]
Z = array(Z)# Suite complexe de la spirale "oblique" finie.
plot(Z0.real, Z0.imag, "k")# Spirale "droite" tracée.
plot(Z.real, Z.imag, "r")# Spirale "oblique" tracée.
xlim([0, sqrt(2) * a])# On limite à l'horizontale.
ylim([0, a])# On limite à la verticale.
stdout.write("\rImage {:03d}/{:03d}".format(t, N))
show()# Affichage .
file = data + "spirale{:03d}.png".format(t)# Les fichiers
#image ont des noms génériques du numéro 000 à 999.
try:# On vérifie si le fichier existe déjà.
o = open(file, mode='x')#Pas encore? On crée.
o.close()
except FileExistsError:# Erreur: ce fichier existe.
o = open(file, mode='w')#On l'a déjà ? On écrase.
o.close()
savefig(fname=file, \
format='png', \
transparent=True, \
frameon=False )# On enrengistre le fichier PNG
#avec un arrière-plan transparent.
pause(0.005)# Temps d'arrêt entre les images.
stdout.write("\n")
close(fig)# Fermer la fenêtre du graphe.
print("Terminé.")
graph()# On lance tout ça !