Bonjour les amis
Je suis en train travailler sur une application Dont l utilisateur va dessiner avec la souris un contour quelquonque;
le programme va recuperer les coordonné de tout les pixels formant le contour.
j'ai deja depassé cette étape .
dans une deuxieme etape ,je dois colorer l'interieur du contour .et là mon probleme ;
J'ai déja fait une solution qui ne marche pas dans tout les cas je vais la publier plus tard pour ne pas orienter les reponses.
Bon , pas d'idees ? ou fonctions sdl qui peuvent m'aider?
merci pour toute reponse a l'avance .
Tu récupères les coordonnées de chacun de tes pixels formant ton contour et, pour chacun de ces pixels contour, tu effectues un parcours horizontal : Tu pars du pixel, et tu colorises (tu ajoutes un pixel coloré) tant que la case x+1 n'est pas un pixel contour !
@MrFlow:merci pour ta réponse , en fait c'est la meme idée que j'ai fait .avec une petite difference que j''ai pensé à faire une balayage vericale suivant les Y.
Bon elle n'est pas mal regarde ce qu'elle peut faire cette idée : contour dessiné par l'utilisateur http://www.siteduzero.com/upload-216.h [...] extarea=intro
J'ajoute mon petit grain de sel... à mon avis dans pas 1er étape, il ne faut pas stocker tous les points (dans une variable), mais juste colorer chaque pixel voulu (c'est vraiment moins lourd) avec :
*((Uint32*)(map->pixels) + x + y * map->w) = color;
(à la position x, y, sur la surface map, on met la couleur color)
XX3 je n'ai pas eu accès a tes liens, mais utilises ma méthode (pas optimale mais fonctionnelle) et ça devrait marcher.
Ou sinon balance ton algorithme ici !
Je suis desolé pour le retard , j'ai pas eu le temps pour repondre ;
Mrflow :
voici mon code :
int j;
int verif=0;int a,b;
for( int i=min; i<max;i++)
{
//if (max<i) {i=640;j=480;}
//{
verif=0;
for ( j=0;j<480;j++)
{
if (t[i][j] &&!verif) { a=j;verif=1;}
if (t[i][j]&&verif) b=j;
}
if (a<b)
{
for (int k=a;k<b;k++)
{
position.x=i;
t[i][k]=1;
position.y=k;
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // Remplissage de la surface avec du blanc
SDL_BlitSurface(rectangle, NULL, ecran, &position);
SDL_Flip(ecran);
}
}
et voila son execution :
Mrflow esperant que tu passes par ici tu vois bien que cette idée donne des resultats tres mauvaise pour certain forme !
@Fvirtman vraiment merci pour ton aide mais je sais pas pourquoi l algorithme de remplissage ne permet pas de colorer qu'une surface qui occupe 60000 pixel c beaucoup tres inferieur a ma surface qui occppe 480*640 pixel ; c dommage ; pas de solution ?
Je suis desolé pour le retard , j'ai pas eu le temps pour repondre ;
Mrflow :
voici mon code :
int j;
int verif=0;int a,b;
for( int i=min; i<max;i++)
{
//if (max<i) {i=640;j=480;}
//{
verif=0;
for ( j=0;j<480;j++)
{
if (t[i][j] &&!verif) { a=j;verif=1;}
if (t[i][j]&&verif) b=j;
}
if (a<b)
{
for (int k=a;k<b;k++)
{
position.x=i;
t[i][k]=1;
position.y=k;
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // Remplissage de la surface avec du blanc
SDL_BlitSurface(rectangle, NULL, ecran, &position);
SDL_Flip(ecran);
}
}
et voila son execution :
Mrflow esperant que tu passes par ici tu vois bien que cette idée donne des resultats tres mauvaise pour certain forme !
@Fvirtman vraiment merci pour ton aide mais je sais pas pourquoi l algorithme de remplissage ne permet pas de colorer qu'une surface qui occupe 60000 pixel c beaucoup tres inferieur a ma surface qui occppe 480*640 pixel ; c dommage ; pas de solution ?
J'ai un peu peur, mais je me lance quand même: rectangle c'est un rectangle de 1px*1px?! => utilise direct l'écrire d'un pixel sur une surface (voir mon commentaire qq post au dessus...)
Et y'a de gros pb d'optimisation (genre réécrire position.x=i (b-a) fois...)
Par contre je vois pas en quoi le résultat est mauvais pour certaines formes... çà m'a l'air plutot pas mal (même si c'est non antialiasé! ^^)
t[][] c'est quoi? un tableau avec la position de tous les points? (voir mon commentaire qq post au dessus...)
Ah oui, j'ai pas les yeux en face des trous!
Je pense voir ou est le problème. En fait, quand tu fais "if(t[i][j]&&verif)b=j;" dans ta boucle et qu'il y a un zigzag, b est setté plusieurs fois, dont la dernière valeur est le dernier zigzag, d'ou un remplissage trop important...
int i, j; // en C, on déclare les variables au début...
int a, b;
for(i=min; i<max;i++)
{
a = -1;
b = -1;
for (j=0; j<480; j++)
{
if (t[i][j] && a == -1)
{
a = j;
}
else if (t[i][j]&& b == -1)
{
b=j;
}
if (a<b)
{
position.x=i;
for (position.y=a; position.y<b; position.y++)
{
t[i][position.y]=1;
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // Remplissage de la surface avec du blanc
SDL_BlitSurface(rectangle, NULL, ecran, &position);
SDL_Flip(ecran);
}
a = -1;
b = -1;
}
}
}
Ah oui, j'ai pas les yeux en face des trous!
Je pense voir ou est le problème. En fait, quand tu fais "if(t[i][j]&&verif)b=j;" dans ta boucle et qu'il y a un zigzag, b est setté plusieurs fois, dont la dernière valeur est le dernier zigzag, d'ou un remplissage trop important...
int i, j; // en C, on déclare les variables au début...
int a, b;
for(i=min; i<max;i++)
{
a = -1;
b = -1;
for (j=0; j<480; j++)
{
if (t[i][j] && a == -1)
{
a = j;
}
else if (t[i][j]&& b == -1)
{
b=j;
}
if (a<b)
{
position.x=i;
for (position.y=a; position.y<b; position.y++)
{
t[i][position.y]=1;
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // Remplissage de la surface avec du blanc
SDL_BlitSurface(rectangle, NULL, ecran, &position);
SDL_Flip(ecran);
}
a = -1;
b = -1;
}
}
}
j ai bien aimé ton idée, AstroB ,mais , l execution est parfois tres mal alors que la modification que tu as fait parait logique , voila son execution :
tu m as posé la question sur le tableau t[][] ,pour moi c est une matrice booleenne de taille 640*480 contenant
des 0 a l'etat initial .
en dessinant avec la souris un contour quelquonque;
le programme va recuperer les coordonné de tout les pixels formant le contour par marker des 1 dans le tableau t [][].
en remplacant juste cet algorithme par un algorithme recursive basé sur l idée de remplissage par diffusion on obtient un resultat qui parait parfait :
le probleme que si la taille de la surface a colorer depasse une certaine valeur , il se plante , et j ai pas trouvé de raison logique pour expliquer .
si mon algorithme permet de colorer les petites surfaces , pourquoi pas pour les grandes surfaces ??????????
je précise en 2010, je ne vois même pas comment tu t'y prend pour faire exploser la pile en faisant un flood fill récusrif...
Je precise en 2010 , je ne vois meme pas comment cette pile explose avant moins de 60000 appelle a une fonction contenant une seule instruction !! ????
je peux pas tester sur les couleurs des pixel car
l utilisateurs va dessiner sur des ecran dont le font est une image reelle et en plus choisi par lui ,ceci est d'une part
d autre part j ai besoin de ce tableau pour le reste de traittement
Le nombre d'appel limite n'est pas énorme, et ne dépend pas que du nombre d'appels mais également des variables locales.
En effet, si tu considères une fonction récursive qui embarque par exemple un int tab[5000], tu fais sauter ta pile en très peu d'appels.
Sinon, oui, pour le floodfill, il est conseillé de casser la récursion par l'utilisation d'une structure de pile et un while
edit: correction d'une bourde sur les limites de l'écran.
edit2: comme je ne pars que dans 4 directions, ça ne fonctionne pas pour colorier une bordure fine.
Merci pour ce code sa va me permettre d'apprendre encore plus sans faire de recherche (surtout pour mon Lecteur MP3 et j'en profite justement car j'ai besoin d'aide ici)
PS : SDL_BYTEORDER == SDL_BIG_ENDIAN ??? on peut m'expliquer s'il vous plait
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html