SpiraleRectangle little project added

This commit is contained in:
F. Y. H. 2022-07-25 09:31:30 +02:00
parent f569de76b0
commit ee6ef92b40
4 changed files with 178 additions and 0 deletions

View file

@ -0,0 +1,20 @@
### Juste pour en faire un.
Ici, j'explique un peu comment faire le fameux fichier *GIF*.
Le répertoire racine est `projet_spirale_rectangle/`
D'abord, on exécute le script *Python* `./main/spirale_rectangle.py`.
On obtient alors dans `./data/` des images en format *PNG*. Ces
fichiers ont les noms génériques `spirale***.png``***` est un
numéro de *000* à *999*.
On termine alors avec le script *Bash* `./bash/spirale_rectangle.sh`.
Des fichiers intermédiaires `spiralebis***.png` sont générés avant
de créer dans `./output/` le fichier final `spirale_rectangle.gif`.
J'ai fait ce tout petit projet pour passer le temps. C'est cadeau,
mais c'est moi qui l'ai fait !
:Organization: Alnotz Corp.
:Author: Alnotz
:Date: 02/09/2018
:Licence: GNU General Public License 3

View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Ce petit fichier permet de créer un fichier image GIF à partir d'un séquençage de fichiers PNG. Suite
#+à un script Python du nom de spirale_rectangle.py.
# La commande convert de ImageMagick permet de retaper cette suite d'images et leur séquençage.
# On est dans le répertoire-racine du projet : projet_spirale_rectangle/.
echo " " ;
echo "Troncage des images." ;
echo " " ;
for IMAGE_NO in $( seq 0 39 ; ) ; #Sur plusieurs fichiers PNG...
do
convert -verbose -crop 126x94+327+149 +repage ./data/spirale$( printf "%03d" "$IMAGE_NO" ).png \
./data/spiralebis$( printf "%03d" "$IMAGE_NO" ).png #On rogne bien chaque image.
done ;
for i in $( seq 0 39 ) ;
do
IMAGE_LISTE[$i]=./data/spiralebis$( printf "%03d" "$i" ).png ; #Liste des nouveaux fichiers PNG.
done ;
echo " " ;
echo "Création du fichier GIF." ;
echo " " ;
LISTE=${IMAGE_LISTE[@]} ;
convert -verbose -dispose previous -delay 10 -loop 0 $LISTE ./output/spirale_rectangle.gif ; #Puis on assemble en un fichier GIF.
echo "Terminé." ;

View file

@ -0,0 +1,20 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
### Info générale
Le programme principal est exécutable comme un module.
#### Arborescence de `projet_spirale_rectangle`
./
bash/
spirale_rectangle.sh
data/
main/
**__init__.py**
spirale_rectangle.py
output/
README.md
"""

View file

@ -0,0 +1,113 @@
#!/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 !