#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Dec  7 16:27:37 2022

@author: vincentleprince
"""

import numpy as np
import matplotlib.pyplot as plt
import random as rd




points = [(-0.14052840523526092, 3.483186147758519),
 (-0.3292743163116352, 3.51042565315023),
 (-0.24417343739852077, 2.3079735744098473),
 (-0.3294571104623631, 4.319863349316977),
 (-0.5756477777142489, 3.5496569813990995),
 (4.637455131314444, 2.239696047487988),
 (2.2395741753319998, 1.0594731196227243),
 (3.163084885603951, 3.086204249414057),
 (2.682667948771587, 0.09793375120503423),
 (3.135577025166637, 2.3299245192038396),
 (-2.1337034428083803, -0.41737951523447736),
 (-2.451490889077955, -0.9674486801482786),
 (-1.2235436334445147, -0.9073574765797205),
 (-0.4118571289039419, -2.49483302418711),
 (-2.9656384582079456, -1.6128086008745428)]

"""
Cette liste de points à été obtenue par les commandes suivantes :
    
points_1 = [(rd.gauss(0,1),rd.gauss(3,1)) for _ in range(5)]
points_2 = [(rd.gauss(3,1),rd.gauss(2,1)) for _ in range(5)]
points_3 = [(rd.gauss(-2,1),rd.gauss(-1,1)) for _ in range(5)]

points = points_1 + points_2 + points_3

"""


#tracé   du graphique

Xpoints = [ P[0] for P in points]
Ypoints = [ P[1] for P in points]

plt.scatter(Xpoints,Ypoints)

plt.show()


# Fonctions utiles

def dist(P1,P2):
    """renvoie la distance entre deux points,
    représentés sous forme d'une liste ou d'un couple de deux éléments"""
    #A compléter

def pointLePlusProche(P,listePoints):
    """renvoie le point le plus proche de P dans la liste listePoints
    ainsi que son indice i"""
    #A compléter

def regroupement(listePoints , pointsMoyens ):
    """renvoie  une liste L de listes de points.
    L[i]  est la liste des points de listePoints 
    dont l'élément le plus proche parmi les points de pointsMoyens
    est pointsMoyens[i]"""
    # k est défini de manière globale
    L = [ [] for _ in range(k) ] # L[i] devra contenir les points les plus 
                                # proches de pointsMoyens[i]
    #A compléter

def pointMoyen(listePoints):
    assert listePoints != [] 
    """ signale que l'on rencontre le problème suivant :
        l'une des classe est vide (le calcul de son barycentre 
        n'a alors pas de sens).
        La conséquence avec l'algorithme tel qu'il est programmé ci-desous
        était qu'il ne terminait pas.
    """
    #A compléter


    

#PROGRAMME PRINCIPAL

# rappel : la liste des points à classer est la liste points

# choix de k

k = 3

#initialisation des points moyens

# les deux suivants ne fonctionnent que pour k=3
pointsMoyens1 = [ (-2,-1) , (0,3) , (4,2)]
pointsMoyens2  = [ (-2,-1) , (0,3) , (-1,3)]

#On pourra tester avec des points de départ aléatoire :
pointsMoyens3 = [ (rd.gauss(0,3) , rd.gauss(0,3)) for _ in range(k)]
#Cette initialisation peut ne pas  fonctionner  (boucle ne se terminant pas)
# si l'un des groupes initiaux est vide

#initialisation du premier regroupement
pointsMoyens = pointsMoyens1.copy()
listeGroupes = #A compléter


#initilisation des barycentres
nouveauxPointsMoyens = []
#A compléter
    


#A compléter
    
    
#print(pointsMoyens)    

 
# on fait apparaître maintenant les groupes en différentes couleurs

listeCouleurs = [ 'red' , 'blue' , 'green' , 'yellow']

#A compléter

    

