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

Windows Forms Discussion :

A propos de Charts


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Par défaut A propos de Charts
    Bonjour,

    Je cherche a afficher une selection d un utilisateur dans un chartArea.
    De facon plus precise, etant donne une courbe (ensemble de points(x,y)), une borne inferieure et une borne superieure, j'aimerai visualiser la portion de courbe contenue entre ces 2 bornes (un peu comme une integrale, ici).

    J'ai pense a faire un chart de type RangeChart et de l'ajouter a la chartArea en dessinant le rangeChart entre l'axe x et la courbe... mais je pense qu il doit exister quelque chose de "deja fait", sans avoir a creer une nouvelle Series dans la chartArea.

    PS: si cela n'existe pas, quelqu'un sait comment faire un rangeChart sur seulement une partie de la chartArea ? (je peux pas faire de bind XY mais seulement du bind Y avec un rangeChart -- sur les exemples que j'ai trouves, 2 series sont donnees en entree et en gros c'est la serie superieure et la inferieure et ca bind automatiquement depuis 0 sur l'axe x, puis ca increment de 1 tous les nouveaux points..)

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Pas difficile quand meme...
    Tu utilises le Chart.MouseClick et HitTest pour localiser :
    -un point de depart et un point d'arrivee..
    -l'integrale sinus est un collection Series de type Area(aire)

    code exemple avec un chartarea et 2 series:
    -ptseries type line (courbe sinus)
    -ptfilter type area (dessine ton aire)...
    -un list<int> l est utilise qui recupere les index des 2 points cliques(depart et arrivee)
    -une boucle recupere le "range" des points de ptseries pour les mettres dans ptfilters et ...afficher ptfilter..

    On repart sur une nouvelle selection...

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
     
    namespace WinFormsChart
    {
        public partial class FormIntegraleSinus : Form
        { 
            Series ptSeries1; //type Line
            Series ptFilter;  //type Area
            ChartArea area;
            public FormIntegraleSinus()
            {
                InitializeComponent();
                this.chart1.MouseClick += new MouseEventHandler(chart1_MouseClick);
            }
             int oldBorderWidth ;
             Color oldBorderColor ;
             List<int> l = new List<int>();
            void chart1_MouseClick(object sender, MouseEventArgs e)
            {
                if (l.Count == 2) //Reset selection. =>clear  liste .
                {
                    ptSeries1.Points[l[0]].BorderWidth = oldBorderWidth;
                    ptSeries1.Points[l[0]].BorderColor = oldBorderColor;
                    l.Clear();
                    ptFilter.Points.Clear();
     
                }
     
                //HitTest selection
                HitTestResult result = chart1.HitTest(e.X, e.Y);
                if ( result.ChartElementType == ChartElementType.DataPoint 
                    && result.ChartArea == area 
                    && result.Series == ptSeries1 ) 
                {
                    // ajoute index du point selectionne
                    l.Add(result.PointIndex);
     
                    //memorise son style actuel pour restore
                    oldBorderWidth = ptSeries1.Points[result.PointIndex].BorderWidth;
                    oldBorderColor = ptSeries1.Points[result.PointIndex].BorderColor;
     
                    //feedback user :applique un style au point selectionne..
                    ptSeries1.Points[result.PointIndex].BorderWidth = 4;
                    ptSeries1.Points[result.PointIndex].BorderColor = Color.Tomato;
     
                }
                //s'il y a 2 point. =>dessine integrale ptFilter
                if (l.Count == 2) 
                {
                    int startIndex =l[0];
                    int  endIndex  =l[1]+1;
                    for(int  i= startIndex;i< endIndex ;i++)
                    {
                        DataPoint p = new DataPoint();
                        p.XValue = ptSeries1.Points[i].XValue;
                        p.YValues = ptSeries1.Points[i].YValues;
                        ptFilter.Points.Add(p);
     
                    }
     
                }
     
            }
     
            private void FormIntegraleSinus_Load(object sender, EventArgs e)
            {
                    area = chart1.ChartAreas[0];
                    ptSeries1 =this.chart1.Series[0];
                    ptFilter =this.chart1.Series[1];
                    GetCourbeSinus();
            }
            private void GetCourbeSinus()
            {
                Double  dx = 0.5;
                Double  x=0.0 ;
                Double  y=0.0 ;
     
                for (double i= -50.0; i< 51.0;i++)
                {
                    x += dx;
                    y = 10.0 * Math.Sin(x);
                    ptSeries1.Points.AddXY(x, y);
                }
            }
     
     
        }
    }
    bon code...

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

Discussions similaires

  1. [SP-2010] Chart WebPart : field proposé
    Par SONY30 dans le forum SharePoint
    Réponses: 2
    Dernier message: 13/02/2014, 13h09
  2. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  3. Créer une série dans un chart
    Par cyrose dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/11/2002, 11h37
  4. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18

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