Programme de dessin Avec Delphi

Fermé
fahim0788 Messages postés 111 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 19 décembre 2011 - 28 juin 2008 à 08:17
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 8 mai 2009 à 19:58
Salut...
Je suis entrain de développer un petit programme de dessin avec Delphi 7 comme Paint de Windows et j'ai rencontré un problème, pour que une zone soit remplie par une couleur il faut tester si la courbe est fermée ou non et je ne sais pas comment effectuer ce test j'ai crée une procedure qui teste les pixels de la bordure un par un et revenir au début mais ça marche pas et le programme entre dans une boucle infinie, aidez moi svp je veux seulement l'idée.
A voir également:

5 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
30 juin 2008 à 23:10
Dans l'idée seulement (je ne parle pas Delphi) voici comment je ferais (si j'avais la méthode)

Il faudrait partir d'un point de ton Espace, appelons le Remplisseur
Admettons que ton Remplisseur possède une couleur R et que ton Espace possède une couleur E.
Il te faut créer deux piles, la première ne contient que ton Remplisseur et la deuxième est vide au départ, mais également une liste contenant tous les points que tu as déjà traité (vide au départ).
Tant que ta première pile n'est pas vide, tu regardes chaque Remplisseur qu'elle contient, tu le rempli de la bonne couleur, puis tu regardes chacun de ces Voisins (verticalement ou horizontalement comme un +).
Si le Voisin est de couleur R ou Eet qu'il n'a pas encore été traité (d'où l'importance de la liste), alors tu le place dans la deuxième pile, sinon tu ne fais rien. Une fois la première pile vide, tu l'inverse avec la deuxième (les Voisins deviennent donc des Remplisseurs).

En suivant ce raisonnement je pense que tu ne devrais pas avoir de récursivité infinie (ps : ne pas oublier le cas du bord de l'image, qu'il faudrait considérer comme n'étant ni de couleur E ni de couleur R)

Un exemple pour mieux expliquer ce à quoi je pense (au cas où je me serai mal exprimé):
Sur mon clavier numérique j'ai les touches 1,2,3,4,5 qui forment mon espace à colorier, (6,7,8 ne sont pas de la bonne couleur, la couleur de 9 n'a pas d'importance), je clique sur le 4 pour recolorier mon espace.

Tour de boucle 1 :
Pile1=4, Pile2=vide, Liste=vide
Je colorie 4
Je regarde les voisins de 4 (1,5,7) 1 et 5 sont de la bonne couleur
Pile1=vide, Pile2=1,5, Liste=4
J'inverse les piles

Tour de boucle 2 :
Pile1=1,5, Pile2=vide, Liste=4
Je colorie 1
Je regarde les voisins de 1 (2,4) 2 et 4 sont de la bonne couleur mais 4 a déjà été traité
Pile1=5, Pile2=2, Liste=4,1
Je colorie 5
Je regarde les voisins de 5 (2,4,6,8) 2 et 4 sont de la bonne couleur mais ont déjà été traités
Pile1=vide, Pile2=2, Liste=4,1,5
J'inverse les piles

Tour de boucle 3 :
Pile1=2, Pile2=vide, Liste=4,1,5
Je colorie 2
Je regarde les voisins de 2 (1,3,5) 1, 3 et 5 sont de la bonne couleur mais 1 et 5 ont déjà été traités
Pile1=vide, Pile2=3, Liste=4,1,5,2
J'inverse les piles

Tour de boucle 4 :
Pile1=3, Pile2=vide, Liste=4,1,5,2
Je colorie 3
Je regarde les voisins de 3 (2,6) 2 est de la bonne couleur mais a déjà été traité
Pile1=vide, Pile2=vide, Liste=4,1,5,2,3
J'inverse les piles

Pile1=vide : Fin de la boucle -> L'espace a été totalement recolorié
0
ameni.enis Messages postés 22 Date d'inscription mardi 3 février 2009 Statut Membre Dernière intervention 26 mai 2010
7 mai 2009 à 08:31
Salut
SVP KX si vous pouvez me programmer un tour de boucle en C comme exemple pour que je puisse mieux manipuler les piles et la liste en C....
MERCI
Crdlt
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019 > ameni.enis Messages postés 22 Date d'inscription mardi 3 février 2009 Statut Membre Dernière intervention 26 mai 2010
8 mai 2009 à 19:58
J'ai fait un code rapide sans vraiment traiter tous les cas, ni même à vérifier, et j'avoue que même si j'ai l'habitude d'utiliser des piles et d'utiliser le C, je n'avais jamais fait les deux en même temps...

Donc en considerant un "dessin" représenté par un tableau d'entier où l'entier est la couleur, on doit colorier le point x0, y0 et toute la surface de même couleur qui l'entoure (le principe du "remplissage" dans Paint)
typedef int Dessin[1024][768]; 

struct Point{int x; int y;};

Point MakePoint(int x, int y)
{
    Point p={x,y};
    return p;
}
        
void ColorierSurface(Dessin d, int x0, int y0, int Clr)
{
    stack<Point> pile;
    stack<Point> pileSuivante;
    int Clr0=d[x0][y0];
    pileSuivante.pushPoint(Point(x0,y0)); 
    
    while ( !pileSuivante.empty() )
    {
          while (!pileSuivante.empile)
                pile.push(pileSuivante.pop());
                
          while (!pile.empty())
          {
                Point p=pile.pop();
                int x=p.x; int y=p.y;
                d[x][y]=Clr;
                if (d[x-1][y]==Clr0) pileSuivante.push(MakePoint(x-1,y));
                if (d[x+1][y]==Clr0) pileSuivante.push(MakePoint(x+1,y));
                if (d[x][y-1]==Clr0) pileSuivante.push(MakePoint(x,y-1));
                if (d[x][y+1]==Clr0) pileSuivante.push(MakePoint(x,y+1));
          }
    }
}
0
fahim0788 Messages postés 111 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 19 décembre 2011 10
1 juil. 2008 à 00:37
Merci beuacoup pour ton aide je vais essayer tous ça et je vais te répondre après
0
fahim0788 Messages postés 111 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 19 décembre 2011 10
4 juil. 2008 à 00:14
Salut, pouvez vous me dire quelle est la taille des piles?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
4 juil. 2008 à 00:19
Une pile n'a pas de taille, plus tu rajoutes d'éléments et plus sa taille est importante, plus tu en enlèves et plus elle diminue, c'est pourquoi il faut bien penser à la vider (et selon le langage utilisé, libérer l'espace "réservé" lors de la création de la pile)
0
fahim0788 Messages postés 111 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 19 décembre 2011 10
7 juil. 2008 à 00:48
salut, enfin j'ai réalisé ce que tu as dis, mais il y'a un problème avec la bordure si elle est de la mème couleur que le remplisseur le remplissage l'a dépasse, je veux corriger ça...aussi avec cette méthode il y'a un petit retard car l'opération se fait pixels par pixels, il y'a une autre méthode qui fait le remplissage avec des lignes elle est plus rapide je ne sais pas si tu l'as? merci et bonne nuit...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
7 juil. 2008 à 08:18
En suivant ce raisonnement je pense que tu ne devrais pas avoir de récursivité infinie (ps : ne pas oublier le cas du bord de l'image, qu'il faudrait considérer comme n'étant ni de couleur E ni de couleur R)

Tout est dit...

Au début du post tu avais une boucle infinie, et je t'ai donné une méthode, j'ai pas dit que c'était la meilleure, juste que ça me semblait faire ce que tu voulais (j'ignorais moi même la lenteur de la méthode).

En ce qui concerne la bordure, bah... J'avais prévenu (lol). Selon comment tu as programmé ton code je dirais qu'il faudrait d'office mettre la bordure avec une "couleur impossible" (un peu comme le nil des piles...)
0