Programme de dessin Avec Delphi
fahim0788
Messages postés
111
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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.
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:
- Programme de dessin Avec Delphi
- Delphi 7 - Télécharger - Langages
- Programme demarrage windows - Guide
- Dessin clavier zizi ✓ - Forum Programmation
- Programme bonjour - Forum Windows
- Logiciel dessin technique gratuit - Télécharger - CAO-DAO
5 réponses
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é
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é
Salut, pouvez vous me dire quelle est la taille des piles?
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...)
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...)
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
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)