113 lines
3.6 KiB
Python
113 lines
3.6 KiB
Python
|
#!/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 !
|