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 :

aide pour dessiner un cerle


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut aide pour dessiner un cerle
    Salut tous le monde;

    je veut dessiner un cercle sur une image; j'ai qlq idés mais comme je suis débutant en C++ builder je cherche l'aide:

    - Par exemple j'utilise la sourris quand je click la 1èr fois ca sera le centre du cercle; et quand je click la 2ème fois ca sera pour déterminer le rayon

    pour dessiner le cercle je sais faire ca mais pour la première étape c'est ca quesque je cherche car si je met:

    x1,y1=centre (1èr click)
    x2,y2=Rayon(2ème click)

    Image1->Canvas->Ellipse(x1,y1,x2,y2);

    alors je cherche l'aide pour la première partie etmecri d'avance.

  2. #2
    Membre émérite
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Par défaut
    Salut Apparement il faut voir du coté des Events( Evenement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i =0
     
    Quand je click avec le bouton gauche :
         Si i%2=0 Alors
               Get Position of Center
               i++
         Ou Si i%2=1 Alors
               Get Position of Rayon
               i++
         Fin Si
    Fin Quand
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    bonjour;

    Merci parp1 pour l'aide mais j'ai pas pu le réaliser sur C++ builder

    Le programme que j lé met :

    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
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    int X, int Y)
    {
    X_cen=X; Y_cen=Y; 
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Image1DblClick(TObject *Sender)
    {
    int R;
    R=UpDown1->Position;
    x1=X_cen-R;
    y1=Y_cen-R;
    x2=X_cen+R;
    y2=Y_cen+R;
    Image1->Canvas->Pen->Color=clRed;
    Image1->Canvas->Brush->Style=bsClear; //Color=clBlue;
    Image1->Canvas->Ellipse(x1,y1,x2,y2);
     
    }
    mais il me dit que X_cen et Y_cen sont des valeurs assigned never used

    Pour la 1èr partie je veut la changer comme j'ai dit avant; je veut qd je click la première fois je fixe le centre et la 2ème pour préciser le rayon alors j'élimine :
    R=UpDown1->Position;
    car je vé le choisi manuellement avec la sourris

    s'il y a qlq'1 qui peut m'aider merci d'avance.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Bonjour;

    pas de réponse mais c'est pas grave chez moi j'éssai tjrs a résoudre ce problem

    par exemple le programme est:

    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
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    int X, int Y)
    {
    int X_cen,Y_cen;
     
    X_cen=X; Y_cen=Y;
     
    // pour affichage des coordonées de la souris sur la status bar, et cela pour vérifier s'il prend les valeur du centre ou non
     
    StatusBar1->Panels->Items[0]->Text=IntToStr(X_cen)+","+IntToStr(Y_cen)+"#"+IntToStr(Image1->Canvas->Pixels[X_cen][Y_cen]&0xFF);
     
    }
     
     
     
    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
     
    // Pour afficher la longueur du rayon du cercle 
     
    Edit1->Text=UpDown1->Position;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Image1DblClick(TObject *Sender )
    {
     
    int R,x1,x2,y1,y2;
     
    R=UpDown1->Position;
    x1=X_cen-R;
    y1=Y_cen-R;
    x2=X_cen+R;
    y2=Y_cen+R;
    Image1->Canvas->Pen->Color=clRed;
    Image1->Canvas->Brush->Style=bsClear; //Color=clBlue;
    Image1->Canvas->Ellipse(x1,y1,x2,y2);
     
    }
    Mais le probleme c'est:

    quand j'exécute ce programme il me dit dans la partie (:Image1DblClick) que les valeur X_cen et Y_cen ne son pas définie et quand je les met avec les entier c-a-d:
    int R,x1,x2,y1,y2,X_cen,Y_cen;

    il marche mais il trace pas le cerle, comme si il ne fixe pas la valeur du centre ou je ne sé pas!!!

    s'il vous plait s'il y a qlq'1 qui peuve m'aider je le remerci d'avance.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Ton probleme n'est pas un pb d'algorithmie mais de code C++... il faudrait poster dans le bon Forum.

    Cela dit, ton probleme vient du fait que "X_cen" et "Y_cen" sont des variables internes a la methode "Image1MouseMove()". Elles ne sont donc pas accessibles par la methode "Image1DblClick()".

    Comment ca se fait que cela compile sans erreur ??? Tu n'aurais pas rajouté une definition de "X_cen" et "Y_cen" dans le fichier .h, pour te debarasser de l'erreur ?

    Supprime la ligne "int X_cen,Y_cen;" dans la methode "Image1MouseMove()" et ca devrait aller mieux...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Merci pour la réponse et l'aide

    Quand je supprime la ligne comme tu ma dit il m'affiche :

    Undefined symbol 'X_cen'
    Undefined symbol 'Y_cen'

    alors!!!

    et pour le forum dans quell endroit tu peut m'envoyez et merci d'avance.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tes Xcen Ycen doivent être des paramètres de ton TForm1....

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut hapchlolo:
    Place un point d'arret dans ton code pour pouvoir verifier que tu passe des valeurs a tes coordonnees

  9. #9
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Si j'ai bien compris ce que tu souhaites faire, il faudrait calculer le rayon à l'aide des paramètres (X,Y) soit dans la OnMouseMove (pour saisir et représenter ce cercle lors du movement de la souris) soit le faire dans la OnMouseUp.
    On suppose avoir déclaré en global (OU comme propriétés d'une form) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double Rayon;
    TPoint Centre;
    Dans la OnMouseDown :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Centre = Point(X,Y)
    Rayon = 0.0;
    //REM : (X,Y) paramètres de OnMouseMove ou OnMouseUp, au choix selon que...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rayon = hypot(Centre.x - X, Centre.y - Y); //inclure math.h pour hypot
    Ton cercle se dessine à l'aide de TCanvas::Ellipse de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Canvas->Ellipse(Centre.x - Rayon, 
                    Centre.y - Rayon, 
                    Centre.x + Rayon, 
                    Centre.y + Rayon);
    Pour dessiner ton cercle en suivant le mouvement de la souris, il est necessaire d'effacer à l'ancienne position et de dessiner à la nouvelle.
    Pour celà on fixe dans la OnMouseDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Canvas->Pen->Mode = psNot;
    Canvas->Pen->Style = psSolid;// il vaut mieux !
    Canvas->Pen->Color = clBlack;
    Canvas->Brush->Style = bsClear
    Dans la OnMouseMove il suffira de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Canvas->Ellipse(...); //efface
    Rayon = hypot(...); //nouvelle position
    Canvas->Ellipse(...); //dessine
    Il suffira de contrôler ce que l'on fait dans la OnMouseMove à l'aide d'un flag (un bool déclaré en global OU comme propriété d'une form) activé dans la OnMouseDown puis désactivé dans la OnMouseUp.
    On peut également développer une méthode OnMouseMove suplémentaire ce qui permet de se passer du flag !

    A plus !

  10. #10
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Par défaut
    Merci beaucoup chèr ami

    Pour toi " henderson " tu ma donner plusieurs aidés et j'ai réussi a avoir résoudre mon probleme ( mnt je peut fixé le rayon avec " UpDown " et qd je click 2 fois j'aurai mon cercle )

    je veut effacer l'ancien cercle avec un bouton ( retour en arrière par exemple)

    et pour ton programme j'ai pas réussi a le mettre si tu peut me donner une expliquation plus détailler et Merci d'avance.

  11. #11
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Défaire le cercle revient à redessiner le fond tel qu'il était avant l'ajout du cercle.
    Effacer un cercle (parmi d'autres figures) peut aussi se faire en redessinant l'ensemble des figures restantes (le cercle qui est supprimé peut ne pas être la dernière figure de la liste).
    Dans ce cas précis, on se trouve à redessiner le fond, probablement en ayant objétisé ces figures (reste à voir si cela doit être envisagé ici).
    Les moyens à mettre en oeuvre dépendent donc de la nature même de ce programme.

    Pour la saisie du cercle, en faisant au plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <math.h"
    bool DessinerCercle = false; // A activer le moment venu pour une saisie
    double Rayon;
    TPoint Centre;
    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
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(DessinerCercle)
        {
        Canvas->Pen->Style = psSolid;
        Canvas->Pen->Mode = pmNot;
        Canvas->Pen->Color = clBlack;
        Canvas->Brush->Style = bsClear;
        Centre = Point(X,Y);
        Rayon = 0.0;
        }
    }
     
     
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(DessinerCercle)
        {
        Canvas->Ellipse(Centre.x - Rayon,
                        Centre.y - Rayon,
                        Centre.x + Rayon,
                        Centre.y + Rayon);
        Rayon = hypot(Centre.x - X, Centre.y - Y);
        Canvas->Ellipse(Centre.x - Rayon,
                        Centre.y - Rayon,
                        Centre.x + Rayon,
                        Centre.y + Rayon);
        }
    }
     
     
    void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(DessinerCercle)
        {
        DessinerCercle = false; //termine l'opération
        //Eventuellement pour finir on pourrait faire :
        /*
        Canvas->Pen->Mode = pmCopy;
        Canvas->Ellipse(Centre.x - Rayon,
                        Centre.y - Rayon,
                        Centre.x + Rayon,
                        Centre.y + Rayon);
        */
        }
    }
    On a ainsi l'avantage de voir à quoi va ressembler le cercle et donc de l'ajuster lors de cette saisie.

    Pour ce qui est du développement d'autres méthodes (événementielles) qui viendraient se mettre en lice dans l'exécution, celà dépend du contexte dans lequel s'inscrit ce progamme.
    S'il ne s'agit que de dessiner un cercle, alors ce que j'ai donné suffit (pour éviter du développent inutile)!
    Par ailleurs, dans un contexte de DAO, l'objétisation des figures géométriques permettrait d'apporter d'autres fonctionnalités, en particulier en introduisant des poignées de contrôle (sélection, déplacement et remodelage des figures).
    On en est peut-être très loin ici !

    A plus !

Discussions similaires

  1. aide pour le logiciel d'emailing ec-messenger (e-cerle)
    Par wachmotep dans le forum E-Mailing
    Réponses: 0
    Dernier message: 23/05/2012, 13h37
  2. [Débutant] Aide Pour dessin
    Par zyaya dans le forum C++Builder
    Réponses: 3
    Dernier message: 19/01/2011, 15h31
  3. [Activité] besoin d'aide pour dessiner un diagramme d'activité
    Par curious_31 dans le forum Autres Diagrammes
    Réponses: 0
    Dernier message: 15/12/2009, 20h29
  4. demande d'aide pour dessiner un cercle
    Par nadjib2007 dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/09/2007, 20h09
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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