This commit is contained in:
DylanVsn 2020-02-02 21:42:13 +01:00
parent 2e3a2f89ad
commit 65f1eb78d9
2 changed files with 39 additions and 43 deletions

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys, os
import matplotlib.pyplot as plt
from random import random, choice
import numpy as np
from time import sleep
import argparse
@ -11,27 +10,48 @@ from math import * # pour utliser les fonctions mathématiques dans l'option -f
MNI TP3 - 27 janvier 2020
Dylan Voisin - M1 Informatique Luminy
Franck Palacios - M1 Informatique Luminy
Cyril Colin - M1 Informatique Luminy
Notes:
- u1 et u2 ne semblent pas orthogonaux, ceci est à la non utilisation
d'une échelle 1:1 pour l'affichage des points
- u1 et u2 ne sont pas proportionnels par rapport à lambda mais à la
distance entre le barycentre et le point le plus éloigné selon la
composante x ou y
distance entre le barycentre et la limite de la fenêtre
- u1 est orienté «vers la droite» et u2 «vers le haut» dans ce programme
- u1 et u2 apparaîssent comment des traits plutôt que des flèches car
matplotlib gère mal l'affichage de vecteurs, et plt.arrow peut dans
certains cas donner des têtes de flèche assez étranges selon le rapport
y:x du nuage de point
- le code n'a pas besoin d'être touché pour changer le comportement lors
du lancement, exemples:
* afficher un nuage de point selon cos(x) entre 0 et 1 (pas de 0.1 par
défaut et inchangeable sauf dans le code):
> python3 TP3_voisin.py -f "cos(x)" -m 1 -s
* idem mais avec un bruit de 0.5 (-g applique le bruit -n BRUIT dès la génération)
> python3 TP3_voisin.py -f "cos(x)" -m 1 -g -n 0.5 -s
* afficher 10 boucles (avec bruit, défaut=10) avec la fonction sqrt(x)
> python3 TP3_voisin.py -f "sqrt(x)" -m 10 -n 2 -l 10
le délai entre chaque itération se fait avec le paramètre -d SECONDES (ex -d 2.5)
* afficher les points contenus dans le fichier exemple.txt (format plus bas)
> python3 TP3_voisin.py -i exemple.txt -s
* les boucles, génération de bruit à l'initialisation sont également possible pour
la lecture d'un fichier
* on peut afficher l'aide via
> python3 TP3_voisin.py -h
Format du fichier d'entrée:
x0 y0
x1 y1
xn yn
"""
def acquérir_depuis_fichier(filename):
# l_pts = []
# with open(filename) as f:
# for line in f:
# split = line.split()
# if len(split) == 2:
# l_pts.append(list(map(float, split)))
# return np.array(l_pts)
return np.loadtxt(filename)
def calc_barycentre(l_pts):
x = sum(l_pts[:,0]) / len(l_pts)
y = sum(l_pts[:,1]) / len(l_pts)
@ -130,13 +150,11 @@ def get_info_affichage(l_pts):
pb = min(l_pts, key = lambda x: x[1])
pg = min(l_pts, key = lambda x: x[0])
dist = min(max(l_pts[:,0]) - bary[0], max(l_pts[:,1]) - bary[1])
# dist = max(map(lambda x: np.linalg.norm(x-bary), l_pts))
dist_x = max(l_pts[:,0]) - min(l_pts[:,0])
dist_y = max(l_pts[:,1]) - min(l_pts[:,1])
x_range = min(l_pts[:,0]) - 0.1 * dist_x, max(l_pts[:,0]) + 0.1 * dist_x
y_range = min(l_pts[:,1]) - 0.1 * dist_y, max(l_pts[:,1]) + 0.1 * dist_y
u1, u2 = get_u1_u2_affichage(u1, u2, bary, dist_x, dist_y, pb, pg)
# print(u1, u2)
return u1, u2, x_range, y_range
@ -148,7 +166,6 @@ def visualiser_nuage(l_pts):
plt.scatter(l_pts[:,0], l_pts[:,1])
ax.arrow(*bary, *u1, ec="red", fc="white")
ax.arrow(*bary, *u2, ec="orange", fc="white")
# ax.set_aspect('equal')
plt.show()
def animation_nuage(l_pts, loops=10, time_sleep=2, delta_bruit=3):
@ -220,41 +237,20 @@ def main(argv):
print("File", args.input, "not found.", file=sys.stderr)
sys.exit(1)
else:
l_pts = acquérir_depuis_fichier(args.input)
l_pts = np.loadtxt(args.input)
else:
l_pts = []
n = args.max_dot_xval
f = lambda x: eval(args.function) # fonction génératrice de la ditribution
l_pts = np.array([[i, f(i)] for i in np.arange(0, n, 0.1)])
if args.generate_with_noise:
delta_bruit = args.noise # bruit généré, 0 si on en veut aucun
else:
delta_bruit = 0
for i in np.arange(0, n, 0.1):
y = f(i) + choice((-1, 1)) * random() * delta_bruit/2
l_pts.append([i, y])
l_pts = np.array(l_pts)
bruit = np.random.random(len(l_pts)) * 2 * delta_bruit - delta_bruit
l_pts[:,1] += bruit # application du bruit
if args.show:
visualiser_nuage(l_pts)
elif args.loop:
animation_nuage(l_pts, args.loop, args.delay, args.noise)
if __name__ == "__main__":
# if len(sys.argv) == 2:
# l_pts = acquérir_depuis_fichier(sys.argv[1])
# else:
# l_pts = []
# n = 500 # nombre de points
# f = lambda x: x/2 + 3 # fonction génératrice de la ditribution
# delta_bruit = 10 # bruit généré, 0 si on en veut aucun
# for i in range(n):
# y = f(i) + choice((-1, 1)) * random() * delta_bruit/2
# l_pts.append([i, y])
# l_pts = np.array(l_pts)
# # np.savetxt("pts.txt", l_pts, "%f")
# u1, u2 = diagonaliser_matrice22(calc_matrice_corrélation(l_pts))[:2]
# # print(f"{u1/np.linalg.norm(u1)=}\n{u2/np.linalg.norm(u2)=}")
# visualiser_nuage(l_pts)
# animation_nuage(l_pts, 20, delta_bruit=100)
main(sys.argv[1:])