SpiraleRectangle little project added
This commit is contained in:
parent
f569de76b0
commit
ee6ef92b40
4 changed files with 178 additions and 0 deletions
20
SpiraleRectangle/README.md
Normal file
20
SpiraleRectangle/README.md
Normal 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` 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
|
25
SpiraleRectangle/bash/spirale_rectangle.sh
Normal file
25
SpiraleRectangle/bash/spirale_rectangle.sh
Normal 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é." ;
|
20
SpiraleRectangle/main/__init__.py
Normal file
20
SpiraleRectangle/main/__init__.py
Normal 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
|
||||
"""
|
113
SpiraleRectangle/main/spirale_rectangle.py
Normal file
113
SpiraleRectangle/main/spirale_rectangle.py
Normal 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 !
|
Loading…
Reference in a new issue