From ee6ef92b40f38f20727ef84b0fff3c05ff277b1a Mon Sep 17 00:00:00 2001 From: Alnotz Date: Mon, 25 Jul 2022 09:31:30 +0200 Subject: [PATCH] SpiraleRectangle little project added --- SpiraleRectangle/README.md | 20 ++++ SpiraleRectangle/bash/spirale_rectangle.sh | 25 +++++ SpiraleRectangle/main/__init__.py | 20 ++++ SpiraleRectangle/main/spirale_rectangle.py | 113 +++++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 SpiraleRectangle/README.md create mode 100644 SpiraleRectangle/bash/spirale_rectangle.sh create mode 100644 SpiraleRectangle/main/__init__.py create mode 100644 SpiraleRectangle/main/spirale_rectangle.py diff --git a/SpiraleRectangle/README.md b/SpiraleRectangle/README.md new file mode 100644 index 0000000..9e5b031 --- /dev/null +++ b/SpiraleRectangle/README.md @@ -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` où `***` 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 \ No newline at end of file diff --git a/SpiraleRectangle/bash/spirale_rectangle.sh b/SpiraleRectangle/bash/spirale_rectangle.sh new file mode 100644 index 0000000..464c8b8 --- /dev/null +++ b/SpiraleRectangle/bash/spirale_rectangle.sh @@ -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é." ; diff --git a/SpiraleRectangle/main/__init__.py b/SpiraleRectangle/main/__init__.py new file mode 100644 index 0000000..d6f8412 --- /dev/null +++ b/SpiraleRectangle/main/__init__.py @@ -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 +""" \ No newline at end of file diff --git a/SpiraleRectangle/main/spirale_rectangle.py b/SpiraleRectangle/main/spirale_rectangle.py new file mode 100644 index 0000000..7de26ce --- /dev/null +++ b/SpiraleRectangle/main/spirale_rectangle.py @@ -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 ! \ No newline at end of file