Langages Impératifs 2 Projet 25/01/2010 La Machine à café Jean-Jacques Bourdin
#include <stdio.h> #include <stdlib.h> #define OSX #ifndef OSX #include <GL/gl.h> #else #include <GLUT/glut.h> #endif Table 1 Les inclusions Tout informaticien utilise une machine à café. Ça a l air d un truisme mais sachant qu un définition de l informaticien, dûe à Trucmuche [Tru89] est : Un informaticien est une machine qui transforme le café en lignes de code. nous ne pourrons que le remarquer. Notre sujet est donc d étudier non pas les machines à café, ce sujet a été souvent étudié et on trouvera de bonnes synthèses dans la littérature [Clo08, MW10], mais LA machine à café de l informaticien. Introduction La naissance de l Informatique ne manque pas d être un moment particulier. Cette science nouvelle, même si sa base est une théorie mathématique du neuvième siècl e[imak25], n a pu se développer sans l apport important de deux machines : l ordinateur, la machine à café. Nous parlerons donc de la seconde sachant que la première, est, de près ou de loin, au centre des péoccupations de tant d entre nous. 1 Quelques définitions Nous allons maintenant, pour travailler sur des bases sérieuses, définir quelques données et leur type. 1.1 Types utilisés Dans la suite de ce travail nous avons besoin d utiliser des images. Nous avons donc défini des types correspondant. Vous trouverez dans le tableau 2 la définition de notre structure. Bien sûr ceci n autorise pas d ommission du type d images utilisées, ici, le type bmp. Nous trouvons donc au début du fichier bmp.c tout ce qui concerne cela, comme c est visible dans la table 4. 1.2 Quels fichiers? Il faut utiliser des fichiers, bien sûr, en particulier ceux qui sont issus de la librairie standard. Dans notre fichier de tête, nous avons rajouté des inclusions, comme on le voit dans la table 1.
struct Image { unsigned long sizex; unsigned long sizey; GLubyte *data; ; typedef struct Image Image; typedef unsigned short utab [3][3][3]; Table 2 La structure image int ImageLoad(char *filename, Image *image); int ImageSave(char *filename, Image *image); int ImageSaveJPG(char *filename, Image *image); void floattoint3(float, float, float, int *, int *, int *); void inttofloat3(int, int, int, float *, float *, float*); void rgbtohls(float, float, float, float *, float *, float *); void hlstorgb(float, float, float, float *, float *, float *); void modifclr(glubyte *, GLubyte *, int); int gris (Image *), lumineux (Image *), lisse (Image *); 2 Café Table 3 Les prototypes Nous allons passer à la partie la plus difficile, comment obtenir un petit noir à partir d une image déjà fournie. Pour cela, nous pouvons nous appuyer sur l exemple gris donné en cours5. 2.1 Premier essai La fonction gris 5 peut facilement être modifiée pour obtenir du noir. Il suffit pour cela de changer la valeur et d arriver à mettre du noir sur tout l image. C est ce que nous réussissons avec la fonction noir1 (voir la table 6). 2.2 Deuxième essai Nous avons donc tout de suite tenté d améliorer cette solution, pourqu on puisse voir un vrai petit noir. C est ce que nous avons fait avec la fonction noir2 qui est beaucoup plus convaincante (on la trouve dans la table 7). Nous laissons au lecteur le soin de la tester sur machine, ce qui doit être facile puisque les sources sont là. 3 Conclusion Ce travail a été enrichissant. Dommage que notre image produite ressemble si peu à un café. Nous n avons pas su transformer notre ordinateur en machine à café et c est bien l aveu d un
int ImageLoad(char *filename, Image *image) { FILE *file; unsigned long size; unsigned long i; unsigned short int planes; unsigned short int bpp; GLubyte temp; struct { unsigned short int type; /* Magic identifier */ unsigned int size; /* File size in bytes */ unsigned short int reserved1, reserved2; unsigned int offset; /* Offset to image data, bytes */ header; struct { unsigned int size; /* Header size in bytes */ int width,height; /* Width and height of image */ unsigned short int planes; /* Number of colour planes */ unsigned short int bits; /* Bits per pixel */ unsigned int compression; /* Compression type */ unsigned int imagesize; /* Image size in bytes */ int xresolution,yresolution; /* Pixels per meter */ unsigned int ncolours; /* Number of colours */ unsigned int importantcolours; /* Important colours */ infoheader; Table 4 Les types de bmp int gris(image * i) { int j, size; GLubyte * im; size = 3 * i->sizey * i->sizex; im = i->data; for (j = 0; j < size; j ++) { *im++ = (GLubyte) (60); Table 5 la fonction gris
int noir1 (Image * i) { int j, size; GLubyte * im; size = 3 * i->sizey * i->sizex; im = i->data; for (j = 0; j < size; j ++) { Table 6 la première fonction noir int noir1 (Image * i) { int x, y, startx, starty, starti, topx, topy; GLubyte * im; startx = i->sizex / 3; starty = i->sizey / 3; topx = startx + startx; topy = starty + starty; for (y = starty; y < topy; y ++) { im = i->data + 3 * y * i->sizex; for (x = startx; x < topx; x++) { Table 7 la seconde fonction noir
échec que nous devons faire maintenant. Toutefois ce travail n a pas été vain et des pistes ont été défrichées qui nous permettront, dans un proche avenir de réussir ce que, jusqu à présent, nous avons échoué à faire. Références [Clo08] Georges Clowney. Cafés et Cafetières. Ouatte el Ze, 2008. [imak25] Abu Abdullah Muhammad ibn Musa al Khwarizmi. On the Calculation with Hindu Numerals. Bagdad éditions, 825. [MW10] [Tru89] J. Malco-Which. A coffea in paradise. Master s thesis, University of Coffeaville, january 2010. P. Trucmuche. De l informatique et des informaticiens. International Paper of Computer Sience, 1 :47,51, 1989.