Bonjour ! Je suis en train de travailler sur un interpréteur pour un petit langage graphique et je suis actuellement en train de coder une procédure qui va me permette d'imiter l'outil "remplissage" des logiciels de dessin. Ma procédure doit remplir la zone de même couleur autour du curseur en la remplaçant par la couleur courante. Voici le code que j'ai écrit, j'ai essayé de procéder en utilisant une pile explicite de pixel dans laquelle j'ai mis l'ensemble des positions qui reste à traiter :
avec ça, mon code compile mais cela ne me renvoie rien, mon calque n'est pas dutout modiié
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 void fill_using_stack(int x0,int y0, calque *calque,pixel nouveau,int taille_calque){ // j'intialise ma pile de pixel stack_pixel r; pixel px_comparaison; r=create_empty_stack_pixel(); // j'ajoute le pixel de mon calque à la position (x0,y0) dans la pile if(comparaison_pixel(calque->tab[y0][x0],nouveau)==0){ return; } push_pixel(calque->tab[y0][x0],&r); // on initialise une variable qui va permettre de nous déplacer dans le calque // j'initialise les cordonnées (x,y) du 1er pixel int x,y; x=x0; y=y0; //boucle while sur la pile: condition d'arrêt lorsque la pile est vide while(!is_empty_stack_pixel(r)){ // j'enlève un pixel de la pile px_comparaison=pop_pixel(&r); // je remplace le pixel sorti de la pile par le nouveau pixel set_pixel(&px_comparaison,nouveau); // puis je le mets dans le calque à sa position set_calque_pixel(x,y,calque,px_comparaison); // condition sur la coordonée y pour éviter un dépassement du calque ( tableau à 2D ) if(y>0){ // je compare le pixel au nord avec le pixel de remplacement ( nouveau ) if(comparaison_pixel(calque->tab[y-1][x],nouveau)==0){ // si c'est = 0 ça veut dire que les 2 pixels sont différents, push_pixel(calque->tab[y-1][x],&r); // dans ce cas mets le pixel au nord dans la pile } // je décrémente ma coordonée y pour me déplacer au nord y=y-1; } /*même idée pour les autres coordonées : pixel nord,est,ouest */ if(y<taille_calque-1){ if(comparaison_pixel(calque->tab[y+1][x],nouveau)==0){ push_pixel(calque->tab[y+1][x],&r); } y=y+1; } if(x<taille_calque-1){ if(comparaison_pixel(calque->tab[y][x+1],nouveau)==0){ push_pixel(calque->tab[y][x+1],&r); } x=x+1; } if(x>0){ if(comparaison_pixel(calque->tab[y][x-1],nouveau)==0){ push_pixel(calque->tab[y][x-1],&r); } x=x-1; } } }![]()
voici les procédures intermédiaires que j'ai utilisé dans ma procédure de remplissage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 /* fonction pour comparer 2 pixels renvoie 1 si = et 0 sinon */ int comparaison_pixel(pixel px1,pixel px2){ if(px1.c.r == px2.c.r && px1.c.v==px2.c.v && px1.c.b==px2.c.b && px1.o.c==px2.o.c){ return 1; } else return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 /*procédure qui remplacer le pixel de mon calque à la position (x,y) par un nouveau pixel */ void set_calque_pixel(int x, int y, calque *ca,pixel px){ ca->tab[y][x].c.r=px.c.r; ca->tab[y][x].c.v=px.c.v; ca->tab[y][x].c.b=px.c.b; }voilà voilà, mon raisonnement concernant l'utilisation de la pile explicite de pixel est sûrement erroné, j'ai essayé de m'inspirer de l'algo de remplissage par diffusion avec pile explicite mais j'ai du mal à utiliser ma variable px_comparaison !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 /*procédure qui remplacer px1 par px2 */ void set_pixel(pixel *px1,pixel px2){ px1->c.r=px2.c.r; // notation : la composante rouge du px1 = la composante rouge du px2 px1->c.v=px2.c.v; px1->c.b=px2.c.b; }
Je vous remercie par avance, joyeux Nôel !
Partager