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 :

TChart et coordonnées réelles


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut TChart et coordonnées réelles
    Bonjour à tous

    J'utilise le composant TChart pour dessiner des graphiques représentant des données que j'ai récupérer.

    Je voudrais pouvoir obtenir la position de la souris sur ce graph non pas en coordonénes pixels mais en coordonnées réelles (position sur le graph).

    J'ai vu qu'il y avait des fonctions comme CalcPosPoint ou CalcPosValue sur les axes mais cela ne me donne pas ce que je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TPrincipalForm::OnMouseMoveTChart(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
     
            // On va calculer les coordonnées réelles
            int xreel = Chart->LeftAxis->CalcPosPoint(X);
            int yreel = Chart->BottomAxis->CalcPosPoint(Y);
     
            PanelDuree->Caption = "(" + AnsiString(xreel) + "," + AnsiString(yreel) + ")";
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Tu utilises pourtant les bonnes fonctions mais le soucis est que la fonction retourne un double, pas un int.
    J'ai testé avec le code suivant et ca marche très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
       Label1->Caption = "X = " + FloatToStr(Chart1->BottomAxis->CalcPosPoint(X))
                     + ", Y = " + FloatToStr(Chart1->LeftAxis->CalcPosPoint(Y));
    }

  3. #3
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Je comprend pas, moi j'ai des valeurs complètements abérantes.

    Quand je me rapproche de l'axe des x, les x augmentes.

    Voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TPrincipalForm::OnMouseMoveTChart(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
            // On va calculer les coordonnées réelles
            float xreel = Chart->LeftAxis->CalcPosPoint(X);
            float yreel = Chart->BottomAxis->CalcPosPoint(Y);
     
            PanelDuree->Caption = "(" + FormatFloat("0.0", xreel) + "," + FormatFloat("0.0", yreel) + ")";
    }

  4. #4
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Citation Envoyé par kurul1
    Je comprend pas, moi j'ai des valeurs complètements abérantes.

    Quand je me rapproche de l'axe des x, les x augmentes.

    Voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TPrincipalForm::OnMouseMoveTChart(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
            // On va calculer les coordonnées réelles
            float xreel = Chart->LeftAxis->CalcPosPoint(X);
            float yreel = Chart->BottomAxis->CalcPosPoint(Y);
     
            PanelDuree->Caption = "(" + FormatFloat("0.0", xreel) + "," + FormatFloat("0.0", yreel) + ")";
    }
    Pour l'écriture dans ton caption, tu peux utiliser ca aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PanelDuree->Caption =  "(" + FloatToStrF(xreel,ffFixed,7,2) + "," + FloatToStrF(yreel,ffFixed,7,2) + ")";
    FloatToStrF permet de mettre le nombre après la virgule comme tu le désires.

  5. #5
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Merci Masmeta je ne l'a connaissait pas cette fonction. FormatFloat le fait très bien également.

  6. #6
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    sur quel type de graphique travails tu?
    As tu d'autres évennements sur TChart en plus ?
    Y'aurais pas moyen que tu donnes un peu plus de codes?

  7. #7
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Je n'ai pas d'autre évènement sur mon TChart, justement, j'en avait créer d'autre et je les ai enlever pour voir si cela venait de cela, mais cela ne change rien.

    Ma série est de type TFastLineSeries

    En fait, pour être clair, c'est la position de la souris sur le TChart que je cherche à récupérer et non pas le point sur la série ou pointe la souris.

    Le seul code que j'ai sur TChart, c'est celui que j'ai poster plus haut.

    A terme ce que je cherche à faire, c'est pouvoir sélectionner des portion du graph (colorier l'arrière-plan de la portion sélectionnée).

  8. #8
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je te conseil plus d'utiliser la série TShapeSerie qui te permettera de faire plus facilement ce que tu souhaites (et de garder les zone sélectionnée affiché même après un changement de position ou un zoom)

    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
     
    void __fastcall TForm1::Chart1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
        X1 = Chart1->BottomAxis->CalcPosPoint(X);//récupère les premiers points
        Y1 = Chart1->LeftAxis->CalcPosPoint(Y);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Chart1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
        if(Button == mbLeft && nbSerie < 13)
        {
            ShapeSeries[nbSerie] = new TChartShape(this);//créé le nouveau Shape
            ShapeSeries[nbSerie]->ParentChart = Chart1;
     
            ShapeSeries[nbSerie]->Style = chasRectangle;//en rectangle
            ShapeSeries[nbSerie]->X0 = X1;//assigne les points en coordonnés
            ShapeSeries[nbSerie]->X1 = Chart1->BottomAxis->CalcPosPoint(X) ;
            ShapeSeries[nbSerie]->Y0 = Y1;
            ShapeSeries[nbSerie]->Y1 = Chart1->LeftAxis->CalcPosPoint(Y) ;
            nbSerie++;//incrémente le nombre de zone créées
            Chart1->SeriesList->Move(Chart1->SeriesCount()-1,0);//place la dernière zone créé en premier de la liste pour la mettre en arrière plan
        }
    }
    //---------------------------------------------------------------------------
    et dans les déclarations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         TChartShape     *ShapeSeries[14];
         int nbSerie;
    J'ai testé avec un séries TFastLine de dessiné et ca fonctionne.
    En espérant que ca te convienne.

  9. #9
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Je suis vraiment bète des fois, j'avais inverser le X et le Y, c'est pour cela que cela me donnait des valeurs qui ne correspondaient pas.

    Sinon concernant ta solution pour les zones sélectionnées, je vais tester ca, merci en tout cas.

    D'ailleurs, cela m'amène a te poser une autre question. Est ce que c'est possible de changer la couleur des courbes sur une portion ?

    Quand je faisais mes graphique moi même, je mettains une couleur inverser pour les portions de courbe sélectionnée.

  10. #10
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Alors là, c'est un point que j'ai tenté d'éclaircir mais malheureusement je n'ai pas réussi.
    En fait, il existe une méthode prévue pour colorer chaque point de la couleur que l'on souhaite, mais je n'ai jamais réussi à la faire fonctionner.
    L'exemple te donne quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Series1->ColorEachPoint = true;
        for(int t=0;t<Series1->Count()- 1;t++)
        {
    	if(Series1->YValue[t] < 0)   Series1->ValueColor[t] = clRed;
    	else                         Series1->ValueColor[t] = clBlue;
        }
    ce qui est censé te metre les points positifs en bleu et négatif en rouge. Mais je n'ai aucun résultat. Chez moi, la courbe garde la couleur définit par SerieColor.
    J'ai bien trouvé quelques infos sur le net, mais rien n'y fait.

    Si tu trouve une piste, je suis preneur.

  11. #11
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Ok je vais fouiner un peut partout pour voir si je trouve quelque chose Merci

  12. #12
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Ta solution marche nikel Bandy Boy, Merci, le seule souci c'est que cela cache les graduations. N'y aurait-il pas un moyens de laisser les graduations au premier plan ?

  13. #13
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je ne pense pas malheureusement, par contre, tu peux changer le remplissage et hachurer le rectangle dessiné, tu verras à travers le marquage des graduations.

  14. #14
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Ca va pas allé en hachur car je peut sélectionner plusieurs portion sur mon graph. La dernière sélection effectuée est d'une certains couleur que j'appelle Couleur de sélection active et toute les autres sont d'une autre couleur que j'appelle Couleur de sélection passive.

    C'est pas grave, cela va rester comme ça.

    Merci beaucoup pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/02/2013, 17h18
  2. Réponses: 1
    Dernier message: 15/12/2010, 14h54
  3. Obtenir les coordonnées réelles
    Par chep dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/04/2005, 12h05
  4. [TChart] comment remplir un histogramme avec du rouge strié.
    Par :GREG: dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 09h37

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