GBM – Imagerie numérique – TP Nuées dynamiques L'algorithme des nuées dynamiques INTRODUCTION Soit un ensemble I de nVertex points à partitionner, dans l'espace R². Ces partitions ou classes seront structurées autour de centres également appelés noyaux. On désire constituer nNoyaux classes. Pour cela, on va utiliser la méthode de classification autour de centres mobiles également appelée dans ce cas algorithme des nuées dynamiques. Les étapes de l'algorithme sont illustrées par la figure suivante (nNoyaux = 2, nVertex = 20). MISE EN PLACE DONNEES On déclarera en variables globales les données suivantes : int float float int nVertex ; *Vertex_X, *Vertex_Y ; MaxX, MinX, MaxY, MinY ; *Point_App ; /* /* /* /* Nombre de points */ Coordonnées 2D des points */ Limites du nuage de points */ Appartenance des points à une classe */ int nNoyaux ; float *Noyaux_X, *Noyaux_Y ; float *PrecNoyaux_X, *PrecNoyaux_Y ; /* Nombre de noyaux */ /* Coordonnées 2D des noyaux */ /* Idem pour l'étape précédente */ INITIALISATION DES DONNEES L'ensemble (nuage) de points sera lu dans un fichier texte de la forme suivante : Nombre de points nVertex X Y du point 0 X Y du point 1 … X Y du point nVertex-1 Ecrire une fonction LireFichier (adaptation d'une fonction déjà programmée) qui lira nVertex, allouera de façon dynamique les tableaux de coordonnées (en flottants) des points GBM – Imagerie numérique – TP Nuées dynamiques et les lira. Dans cette fonction, on calculera également les dimensions Min et Max en X et Y du nuage. Toujours dans cette fonction, on saisira au clavier le nombre de noyaux nNoyaux puis on allouera les tableaux de coordonnées des noyaux de même que les tableaux de coordonnées des noyaux à l'étape précédente. On allouera enfin le tableau Point_App (de dimension nVertex) qui donnera les appartenances des points ALGORITHME DE CLASSIFICATION INITIALISATION Dans un premier temps, les nNoyaux sont affectés aléatoirement. Il est donc pratique de les initialiser aux premiers points de l'ensemble chargé. Rédiger une fonction Nuees_Dynamiques() qui contiendra l'ensemble de l'algorithme. On commencera donc par son initialisation. ALGORITHME Rédiger une fonction float Distance (float X1, float Y1, float X2, float Y2)qui calcule la distance euclidienne entre (X1,Y1) et (X2,Y2). Rédiger une fonction Affecte_Points_Classe () qui pour chaque point i du nuage va chercher le noyau n qui lui est le plus proche et affecter n à Point_App[i]. L'algorithme est itératif. On va donc réaliser une boucle qui va faire évoluer les noyaux (centres des classes) jusqu'à leur immobilité d'une étape à l'autre. La trame de l'algorithme est la suivante : Initialisation Faire • Sauvegarde les noyaux de l'étape précédente • Affecte_Points_Classe() // Calcul des classes • Calculer les nouveaux noyaux qui sont les isobarycentres des classes • Calculer la distance globale d qui traduit l'évolution des noyaux de l'étape précédente à cette étape Tant que d < 0.01 AFFICHAGE DU RESULTAT La fenêtre OpenGL est paramétrée dans un winInit() avec la fonction gluOrtho2D, utilisée avec les limites du rectangle englobant du nuage de points. Les points des nuages et les noyaux pourront être affichés de deux couleurs différentes. N'hésitez pas à donner un peu d'épaisseur aux noyaux au moyen de la fonction glPointSize(). Il peut également être intéressant de voir l'algorithme évoluer en affichant les noyant à chaque étape. Bon courage…