Guillaume CERUTTI Rémy FANGOUSE Xavier MAIZERAY EPSI Montpellier CSII 2A Année 2008-2009 Professeur : M. Angelilla
Sommaire I. Présentation... 2 A. Mais que sont les fractales?... 2 B. Notre objectif... 2 II. Principe de fonctionnement... 3 A. Le configurateur... 3 B. L animation... 4 C. Le serveur... 4 III. Les clients... 6 IV. Outils et librairies employées... 6 V. Répartition et planning des taches... 7 A. Décomposition... 7 B. Diagramme de Gantt... 7 VI. Résultats... 7 VII. Conclusions... 7 VIII. Perspectives... 7 1
I. Présentation Le projet que nous avons réalisé porte sur l étude des fractales. Nous avons proposé de fusionner le projet d Unix avec celui de Mathématiques. Les contraintes des deux matières sont bien différentes. Pour le projet d Unix, nous devons utiliser les processus, les threads, gérer le réseau entre un serveur et plusieurs clients ainsi que la gestion de fichiers sur le disque. Pour les mathématiques, il nous a été demandé l étude d un principe mathématique et son implémentation dans un programme informatique. Le couplage des deux projets nous a alors semblé très intéressant. A. Mais que sont les fractales? Ce sont des objets mathématiques dont la création ou la forme ne trouve ses règles que dans l'irrégularité ou la fragmentation, et des branches des mathématiques qui étudient de tels objets. Nous pouvons notamment les observer dans la nature. Ce qui permet de les mettre en œuvre dans des applications tels que les jeux vidéos ou les logiciels d architecture en 3 dimensions (ex : dessins d arbres réalistes plutôt que la duplication d un même arbre). B. Notre objectif L objectif de notre projet est de générer une représentation vidéo de fractales animées sur un serveur. Pour ce faire, les différents calculs de fractales sont répartis sur plusieurs postes afin d être par la suite rapatriés sur le serveur. C est alors que celui-ci formeras la vidéo complète du fractale. Fichier XML (Description de l animation) 1) Envoi du fichier XML 2) Traitement et calcul des images de l animation Serveur 5) Assemblage et création de la vidéo 4) Envoi des images Client 3) Enregistre les images 2
II. Principe de fonctionnement La première étape consiste à définir le motif de départ et les différentes séquences de l animation. Pour cela, il faut écrire directement un fichier XML avec la position des différents points dans le temps comme dans l exemple ci-dessous : <intervalimage>30</intervalimage> <nombrepoints>5</nombrepoints> <iteration value="1" /> <point x="0" y="0" /> <point x="10" y="0" /> <point x="15" y="10" /> <point x="20" y="0" /> <point x="30" y="0" /> <iteration value="7" /> <point x="0" y="0" /> <point x="10" y="0" /> <point x="15" y="10" /> <point x="20" y="0" /> <point x="30" y="0" /> Pour des raisons évidentes, nous avons écrit un programme annexe au projet qui va nous permettre de décrire plus facilement et plus intuitivement l animation de la fractale et ainsi d écrire ce fichier XML. Nous avons choisi de réaliser ce programme en Java pour être utilisable aussi bien sur Linux que sur Windows. Cela va nous permettre de répondre au projet de Mathématiques qui nous demande une application sous Windows. Exemple d une Fractale de Koch (avec une évolution des itérations) A. Le configurateur Il se présente sous forme de deux fenêtres graphiques. L une pour définir les paramètres de l animation et l autre permet d avoir une prévisualisation. 3
B. L animation L animation est constituée de clés (lignes du tableau) qui donnent le positionnement de chaque point à un moment T de l animation. On peut donc changer chacun des paramètres pour une clé, comme par exemple les itérations. Dans cet exemple, nous changeons la position en X du 2 ème point. Figure 1 Fractale à l'image 0 Figure 2 Fractale à l'image 30 Les images intermédiaires sont calculées et forment alors l animation. Nous pouvons facilement voir l évolution de l animation grâce au configurateur. C. Le serveur Une fois l écriture du fichier XML enregistré, l utilisateur va exécuter l application Fractale Serveur en lui fournissant le fichier XML de l animation. L application va alors lire le fichier et interpréter les données qui lui seront utiles comme le nombre de séquences clé d animation (ligne du tableau). Il pourra alors choisir de découper automatiquement l animation et envoyer des ordres de calculs à différents clients. Serveur 4
Sur le serveur la réception d une image Bitmap ce fait comme suit : On déclare les variables qui vont nous permettre de manipuler le fichier final et de récupérer dans un buffer de réception les octets correspondant à l image bitmap. int adescripteurfichierbmp; ssize_t anbcarlubmp; char abufferbitmap[size_buffer]; char anomdufichierbmp[size_buffer_pathfile] = "\0"; int ataillefichierbmp = 0; //reception du nom de l'image mytcp.zwreceive(anomdufichierbmp, sizeof(anomdufichierbmp)); //reception de la taille de l'image BMP La réception de la taille de l image va nous permettre de savoir à quel moment les données reçu par la fonction recv() ne concerne plus l image. int anbcarlutaillebmp = mytcp.zwreceive(&ataillefichierbmp, sizeof(ataillefichierbmp)); if(anbcarlutaillebmp > 0 && ataillefichierbmp > 0) { //creation de l'image BMP if ((adescripteurfichierbmp = open(anomdufichierbmp, O_CREAT O_WRONLY, S_IRWXU S_IRWXG S_IRWXO)) < 0) { error_exit("le fichier ne peut pas etre ouvert."); } //reception et ecriture de l'image BMP int anboctetsencours = 0; while(anboctetsencours < ataillefichierbmp) { //on met les données reçu dans le buffer de réception anbcarlubmp = mytcp.zwreceive(abufferbitmap, sizeof(abufferbitmap)); } //on écrit dans le fichier BMP write(adescripteurfichierbmp, abufferbitmap, anbcarlubmp); anboctetsencours += anbcarlubmp; } //fermeture du fichier bitmap if (close(adescripteurfichierbmp)) { error_exit("le fichier ne peut pas etre ferme."); } 5
III. Les clients L application Fractale client, une fois exécuté sur un poste, va proposer ses services au serveur en se connectant à lui via le protocole TCP-IP. Le serveur prend connaissance de ce nouveau client et va lui attribuer un travail à effectuer. Le serveur lui enverra alors le fichier XML et lui demandera, par exemple, de calculer les deux premières clés, c'est-à-dire 31 images dans notre exemple (de 0 à 30). Serveur Client Le client calcule l image grâce à l API OpenGL pour l affichage. Pour chaque image calculée, on effectue une lecture du buffer image de la carte vidéo. // buffer image unsigned char *imagedata; // allocation du bloc mémoire pour la réception de l image imagedata = (unsigned char*) malloc(g_nwidth * g_nheight * 4); //4 pour RGBA // Nettoye la mémoire memset(imagedata, 0, g_nwidth * g_nheight * 4); // lecture du buffer image glreadpixels(0, 0, g_nwidth, g_nheight, GL_RGBA, GL_UNSIGNED_BYTE, imagedata); Une fois qu une image est calculée puis enregistrée sur le disque (côté client), elle est envoyé au serveur qui la reçoit et la stock dans un répertoire «./images». Le serveur se retrouve avec une collection d image et va attendre d avoir toutes les images des différents clients pour démarrer l assemblage de la vidéo avec un logiciel externe, qui est appelé automatiquement par ligne de commande. Après l assemblage effectué, nous obtenons un fichier vidéo «out.avi» sur le serveur. IV. Outils et librairies employées L Interface de Développement Environnement que nous avons utilisé est Netbeans 6.5 avec le plug-in C/C++. Nous avons utilisé la librairie OpenGL l affichage ainsi que ses extensions GLU et GLUT que nous avons rajoutée à notre distribution Linux Ubuntu 8.10. Nous avons utilisé le logiciel «EasyBMPtoAvi» pour la création de la vidéo à partir d une collection d image BMP. 6
V. Répartition et planning des taches A. Décomposition Le projet se décompose en 3 parties principales : L implémentation de l algorithme de calcul de fractale : 4 semaines. La construction de la vidéo à partir des images : 2 semaines. La communication réseau : 3 semaines. B. Diagramme de Gantt Taches/Semaines 1 2 3 4 5 6 Implémentation de l algorithme Guillaume Guillaume Guillaume Guillaume Construction de la vidéo Rémy Rémy Communication Xavier et Rémy Xavier et Rémy Xavier et Rémy VI. Résultats Les résultats obtenus sont concluants. Nous avons une application client serveur qui fonctionne. Les calculs d image sont envoyés aux différents clients puis sont rapatriés par le serveur. Ce qui permet au final d obtenir un fichier enregistré sur le serveur représentant la vidéo. VII. Conclusions Nous avons particulièrement apprécié ce projet de fin d année tout d abord car le sujet était libre. De ce fait nous avons pu travailler sur le sujet choisi en Mathématique afin d y apporter une vue informatique. Par rapport à ce que nous avons vu en cours, nous avons réalisé et géré la communication multiclient avec les sockets, les threads et manipuler les entrées / sorties. Nous regrettons par contre de ne pas avoir pu trouver de fonctionnalité faisant appel aux processus. Pour ce qui est du sujet en lui même, la conception de l algorithme de dessin d une fractale a été très instructif et intéressant. VIII. Perspectives Améliorer la gestion des clients Compression des images en jpeg pour un gain de bande passante Mettre de la couleur sur l animation OpenGL afin de discerner les différentes phases Possibilité de zoomer 7