IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[image] mon programme ne donne rien !


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Points : 74
    Points
    74
    Par défaut [image] mon programme ne donne rien !
    Salut,
    Je n’arrive pas à implémenter l’algorithme de hilditch, J'ai pourtant suivi la procédure décrite à cette adresse :
    http://jeff.cs.mcgill.ca/~godfried/t...on.html#define

    Voici mon programme :
    for(int x=0;x<W;x++)
    for(int y=0;y<H;y++)
    {
    int BP1=0;
    int AP1=0;
    int AP4=0;
    int AP2=0;
    if(Image2->Canvas->Pixels[x][y]==clBlack) {BP1=BP1+1;}
    if(Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y]==clWhite && Image2->Canvas->Pixels[x+1][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y-1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack)AP1=AP1+1;

    if(Image2->Canvas->Pixels[x-2][y]==clWhite && Image2->Canvas->Pixels[x-2][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-2][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-2][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y]==clBlack){AP2=AP2+1;}

    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x-1][y+2]==clWhite && Image2->Canvas->Pixels[x][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack){AP4=AP4+1;}

    if(BP1>=2 && BP1<=6 && AP1==1){
    if((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clWhite)||(AP2==1)){
    if((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clWhite)||(AP4==1)){Image2->Canvas->Pixels[x][y]=clWhite;}
    }
    }
    }
    Mais malheureusement il n’a rien donné, mon image ne change pas .

    Si vous avez une idée laissez moi un message

    A+

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Ce n'est sans doute pas le code ci-dessus qui est en cause mais l'endroit ou il est implémenté.
    L'image doit être rafraichie pour s'afficher sur un écran. Le processus se passe généralement en 2 temps:
    1/ rafraichissement qui indique à Windows quelle zone réafficher
    2/ Le dessin proprement dit

    Pour le dessin le composant TPaintBox permet de dessiner directement dedans, on implémente alors l'événement OnPaint (dans lequel tu pourras mettre ton code).

    J'espère n'avoir pas répondu à côté mais il est difficile de comprendre le fonctionnement d'un prog sans connaitres les objets et les événements manipulés.

    Yarp
    www.senosoft.com

  3. #3
    Membre régulier Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Points : 74
    Points
    74
    Par défaut
    Salut yarp,
    je complète:
    void __fastcall TForm1::Hilditch1Click(TObject *Sender)
    {
    H=Image2->Picture->Bitmap->Height;
    W=Image2->Picture->Bitmap->Width;

    for(int x=0;x<W;x++)
    for(int y=0;y<H;y++)
    {
    int BP1=0;
    int AP1=0;
    int AP4=0;
    int AP2=0;
    if(Image2->Canvas->Pixels[x][y]==clBlack) {BP1=BP1+1;}
    if(Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y]==clWhite && Image2->Canvas->Pixels[x+1][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x+1][y-1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack)AP1=AP1+1;
    if(Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack)AP1=AP1+1;

    if(Image2->Canvas->Pixels[x-2][y]==clWhite && Image2->Canvas->Pixels[x-2][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-2][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x][y+1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x][y-1]==clWhite && Image2->Canvas->Pixels[x-1][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-1][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y-1]==clBlack){AP2=AP2+1;}
    if(Image2->Canvas->Pixels[x-2][y-1]==clWhite && Image2->Canvas->Pixels[x-2][y]==clBlack){AP2=AP2+1;}

    if(Image2->Canvas->Pixels[x-1][y+1]==clWhite && Image2->Canvas->Pixels[x-1][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x-1][y+2]==clWhite && Image2->Canvas->Pixels[x][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+2]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y+2]==clWhite && Image2->Canvas->Pixels[x+1][y+1]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x+1][y]==clWhite && Image2->Canvas->Pixels[x][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x][y]==clWhite && Image2->Canvas->Pixels[x-1][y]==clBlack){AP4=AP4+1;}
    if(Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack){AP4=AP4+1;}

    if(BP1>=2 && BP1<=6 && AP1==1){
    if((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x][y-1]==clWhite)||(AP2==1)){
    if((Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x][y+1]==clWhite && Image2->Canvas->Pixels[x+1][y]==clWhite)||(AP4==1)){Image2->Canvas->Pixels[x][y]=clWhite;}
    }
    }
    }

    Image2->Refresh();
    }
    à bintôt

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Ce qui me géne quand même est que tu écris dans Canvas, et quid du buffer de Picture ? Il me semble que le Refresh doit transférer ce buffer vers le Canvas et donc effacer ton travail.
    Je parie que si tu enlève le refresh tu verras quelque chose, mais volatile.

    Il faut bien distinguer Canvas qui ne doit être manipulé que dans la phase de dessin dont je parlais dans ma 1ère réponse et buffer de l'image.
    Le buffer de l'image est une donnée de sotckage que tu controle, le canvas c'est le buffer de l'écran et c'est Windows qui le controle.
    Le seule endroit on tu peut le controler c'est la pahse dessin car là tu dis à Windows, quelle couleur tu veux affecter. Mais si tu affecte cette couleur à un autre moment, le refresh (le dessin) l'effacera.
    Car la phase de dessin consiste précisement à tout effacer et à tout redessiner. Avec quoi ? avec le buffer de Picture.

    Bref, tu devrais essayer un algo plus simple genre moitié image blanche, moitié noire pour voir si le pb vient du refresh ou de ton algo.
    Mais J'ai fait un essai en écrivant le canvas dans un OnClick (sans refresh) et je vois mon dessin, si je fait Alt+Tab puis que je reviens mon dessin disparait car il a été écrasé par le OnPaint de Windows - cqfd.

    Donc écrit plutot dans TImage->Picture->Bitmap->ScanLine et après déclenche le Refresh cela devrait fonctionner.

    ps Ton code dans un OnPaint fonctionne (sans le Refresh evidemment puisque celui-ci est précisement l'appel du OnPaint). Dans ce cas un TPaintBox est plus indiqué que le TImage, puisque le buffer c'est toi qui le gère par le biais du dessin.

    J'espère avoir été clair dans cette réponse un peu longue.

    Yarp
    www.senosoft.com

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,

    Il y a un autre truc qui me gène, cela ne devrai sans doute pas résoudre ton problème, mais lorsque tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Image2->Canvas->Pixels[x-1][y]==clWhite && Image2->Canvas->Pixels[x-1][y+1]==clBlack)AP1=AP1+1;
    alors que ton x commence à 0, tu te retrouves avec quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Image2->Canvas->Pixels[-1][y]==clWhite && Image2->Canvas->Pixels[-1][y+1]==clBlack)AP1=AP1+1;
    Cordialement,
    Benjamin

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Le mieux serait de traiter via le canvas du bitmap.
    Après traitement :

    ScanLine ne peut être utilisé ici puisque l'on peut avoir des débordements !
    C'est l'intérêt avec Pixels (donc plus lent).

    Ce code est difficile à lire !
    Il aurait été compréhensible, ici, d'avoir sous les yeux un code faisant usage de symboliques.

    A titre perso, j'aurais rédigé dès le départ, dans ce sens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define isblack ==clBlack
    #define iswhite ==clWhite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* matrice 3*3
     
    NW N  NE
    W  C  E 
    SW S  SE
     
    */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* matrice 5*5 sous forme Ligne/Colonne
     
    c11 c12 c13 c14 c15
    c21 ----------- c25
    c31 ----3*3---- c35
    c41 ----------- c45
    c51 c52 c53 c54 c55
     
    */
    Déclaration des symboliques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define c11 Image2->Picture->Bitmap->Canvas->Pixels[-2][-2]
    //...
    //...
    //...
    Pour n'avoir à rédiger que sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BP1+= (C isblack); //ou (c33 isblack) selon la manière dont on symbolise la matrice
    //...
    //...
    //...
    Mais bon... chacun fait bien comme il veut !

    A plus !

Discussions similaires

  1. Mon programme ne donne aucun retour
    Par domxaline dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 30/05/2012, 15h52
  2. le programme ne donne rien
    Par Lisogane dans le forum AS/400
    Réponses: 2
    Dernier message: 21/09/2010, 17h31
  3. Réponses: 1
    Dernier message: 31/07/2010, 18h33
  4. en compilant mon programme me donne erreur
    Par domxaline dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 14/08/2009, 10h23
  5. Mon programme n'affiche rien!!!!
    Par matthieu5978 dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo