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

VB.NET Discussion :

Créer une courbe à partir de points et la modifier avec la souris [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Geologue
    Inscrit en
    Août 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2022
    Messages : 12
    Par défaut Créer une courbe à partir de points et la modifier avec la souris
    Bonjour,

    Je suis actuellement sur un projet qui consiste à actualiser un programme VB6 en Dot Net.

    Une des fonctionnalité du programme est de créer un graphique à partir de points rentrés par l'utilisateur dans un datagrid, puis de créer une courbe de tendance et enfin d'ajuster la courbe en la déplaçant avec la souris. Lorsque que la courbe est déplacée, les coordonnées des points sont recalculées ainsi que l'équation de la courbe (ces données recalculées vont servir par la suite).

    Si la première partie ne me pose pas de problème particulier (créer le datagrid, la courbe), je ne trouve nulle part comment faire pour pouvoir interagir sur la courbe avec la souris.


    Ma question est donc la suivante, dans Visual studio .net, peut-on modifier une courbe d'un graphique à l'aide de la souris et que les nouvelles données soient prises en compte ?

    Merci si vous pouvez m'aider, soit en m'orientant vers un cours avec des exemple ou un tuto, ou un m'indiquant un exemple concret.

    Krn

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Je n'ai pas la solution à ton problème, mais voici 2 outils permettant de connaitre la position en X et Y du curseur de la souris. Il devrait donc te permettre de connaître la position d'un point du graphe et te permettre aussi de désigner la position à laquelle tu veux poser un point.

    Ces outils sont les événements MouseClick et MouseMove détecté sur le contrôle qui présente le graphe. Ces événements donnent les coordonnées du curseur.
    Attention, MouseMove s'active à chaque changement de pixel. MouseClick ne s'active qu'au moment du clic.

    Voici des exemples :

    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
    Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
            Dim X As Long = e.X
            Dim Y As Long = Me.Height - e.Y  ' Inversion de l'axe Y pour correspondre à la réprésentation ordinaire
            MessageBox.Show("X = " & X.ToString & " y = " & Y.ToString)
        End Sub
     
        Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
            Dim X As Long = e.X
            Dim Y As Long = PictureBox1.Height - e.Y  ' Inversion de l'axe Y pour correspondre à la réprésentation ordinaire
            MessageBox.Show("X = " & X.ToString & " y = " & Y.ToString)
        End Sub
     
        'Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        '   ...
        'End Sub
     
        'Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
        '   ...
        'End Sub
    J'espère que ceci t'aidera ...

  3. #3
    Membre averti
    Femme Profil pro
    Geologue
    Inscrit en
    Août 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2022
    Messages : 12
    Par défaut
    Bonjour Phil Rob,

    Ca n'est peut-être pas la solution, mais depuis un moment que je tourne en rond, je n'avais pas envisagé le problème sous cet angle.
    Jusqu'à maintenant j'essayais de trouver comment faire bouger la courbe.
    Mais après votre réponse, je me dis que si je définis un nouveau point en récupérant les coordonnées via MouseClick et que je modifie la courbe après coup, ça peut-être une bonne alternative ou du moins un objectif à ma portée.

    En tout cas merci, je vais essayer d'avancer dans ce sens en attendant l'illumination

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Je ne maîtrise pas du tout la programmation “graphique”, mais j'ai peut-être une piste complémentaire ...
    Si le graphe est un System.Drawing.Graphics, par exemple Dim MonGraphe As System.Drawing.Graphics, affecté au contrôle conteneur du graphe comme ceci (avec un PictureBox par pour l'exemple : PictureBox1.CreateGraphics, il existe de nombreuses méthodes de manipulation, et même de déplacement du graphe.

    Exemple :

    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
    ' Au niveau gloabl du Form
     
    Dim LineaH As System.Drawing.Graphics 
    Dim LineaV As System.Drawing.Graphics 
     
    ' Dans le code d’un bouton BDessiner :
     
        Private Sub BDessiner_Click(sender As Object, e As EventArgs) Handles BDessiner.Click
     
            LineaH = PictureBox1.CreateGraphics()  
            LineaV = PictureBox1.CreateGraphics()
     
            Dim XLeft As Long
            Dim XRight As Long
            Dim YBottom As Long
            Dim YTop As Long
     
            XLeft = 0
            XRight = PictureBox1.Width
            YBottom = 0
            YTop = PictureBox1.Height
     
            Try
    ' Le TextBox TB_X contient la valeur X d’un point donné
                Dim X As Long = TB_X.Text 
    ' Le TextBox TB_Y contient la valeur Y du même point donné
                Dim Y As Long = YTop - TB_Y.Text 
     
    ' Tracer une ligne horizontale et une ligne verticale ayant le point donné pour intersection (traçage d’un réticule)
                LineaH.DrawLine(Drawing.Pens.Black, XLeft, Y, XRight, Y)
                LineaV.DrawLine(Drawing.Pens.Black, X, YBottom, X, YTop)
            Catch
                MessageBox.Show("Valeurs X et/ou Y non convenables")
           End Try
    End Sub
     
    ' Ailleurs …
     
    LineaH.Translate ......... ' ici chercher la méthode adéquate, cf. illustration ci-dessous
    Nom : LineaH.jpg
Affichages : 253
Taille : 30,6 Ko

    Mais je suppose que TranslateTransform concerne le graphe en entier, soit la ligne horizontale dans cet exemple. Je ne sais pas ce qu'il en sera si le graphe est une succession de points ...

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il faut coder toute l'interaction ...

    le plus simple c'est si tu as fait un usercontrol pour dessiner la courbe et que tu fais du drawline/drawcurve
    par exemple sur mousemove tu peux chercher le point le plus proche et lui ajouter un cercle autour de lui, sur le mouse down si tu es proche du point tu démarres un procédé de déplacement (enregistrer les coordonnées, gérer l'incrément de déplacement) , et sur le mouse up si tu étais en train de déplacer un point tu l'enregistres avec ses nouvelles coordonnées
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Femme Profil pro
    Geologue
    Inscrit en
    Août 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2022
    Messages : 12
    Par défaut
    Bonjour Pol63,

    Pour tracer mes courbes je pensais partir sur quelque chose comme ça (ça n'est pas tout à fait au point, mais c'est l'idée générale) :

    Extrait du code :

    'Créer le graphique Pcorr=f(Vbrut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ChartCourbePressio.Series.Clear()
            ChartCourbePressio.Series.Add(New DataVisualization.Charting.Series("V = f(P)"))
            ChartCourbePressio.Series.Item(0).ChartType = False
            ChartCourbePressio.Series.Item(0).MarkerStyle = DataVisualization.Charting.MarkerStyle.Circle
            ChartCourbePressio.Series.Add(New DataVisualization.Charting.Series("Vfluage = f(P)"))
            ChartCourbePressio.Series.Item(1).ChartType = False
            ChartCourbePressio.Series.Item(1).MarkerStyle = DataVisualization.Charting.MarkerStyle.Cross
    'Afficher les points d'etalonnage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ChartCourbePressio.Visible = True
            For Each Ligne As DataGridViewRow In DataGridView1.Rows
                If Not IsNothing(Ligne.Cells.Item(1).Value) Then
                    ChartCourbePressio.Series.Item(0).Points.AddXY(Ligne.Cells.Item(1).Value, Ligne.Cells.Item(2).Value)
                    ChartCourbePressio.Series.Item(1).Points.AddXY(Ligne.Cells.Item(1).Value, Ligne.Cells.Item(4).Value)
                End If
            Next
    'tracer la courbe de tendance point 1 à P0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            '  ChartCourbePressio.Series.Add("Trendline")
            '  ChartCourbePressio.Series("Trendline").ChartType = SeriesChartType.Line
            '  ChartCourbePressio.Series("Trendline").Color = Color.Red
            '  ChartCourbePressio.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "power,1,false,false", ChartCourbePressio.Series.Item(0), ChartCourbePressio.Series("Trendline"))
    'tracer la courbe de tendance P0 à Pe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            '  ChartCourbePressio.Series.Add("Trendline1")
            '  ChartCourbePressio.Series("Trendline1").ChartType = SeriesChartType.Line
            '  ChartCourbePressio.Series("Trendline1").Color = Color.Blue
            '  ChartCourbePressio.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "linear,1,false,false", ChartCourbePressio.Series.Item(1), ChartCourbePressio.Series("Trendline1"))
    'tracer la courbe de tendance Pe à dernier point
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            '  ChartCourbePressio.Series.Add("Trendline2")
            '  ChartCourbePressio.Series("Trendline2").ChartType = SeriesChartType.Line
            '  ChartCourbePressio.Series("Trendline2").Color = Color.Green
            '  ChartCourbePressio.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "power,1,false,false", ChartCourbePressio.Series.Item(2), ChartCourbePressio.Series("Trendline2"))

    Dans l'idéal, mon chef aimerait pouvoir déplacer un point de la courbe en visualisant en direct le déplacement et qu'une fois qu'il a choisi la position de la courbe, les points soient modifiés afin de recalculer les coefficients. Mais ça dépasse largement le domaine de mes compétences !
    A minima, il faut pouvoir déplacer les bornes de la partie linéaire et redessiner le tout.
    Vue mes capacités, la solution proposée par Phil Rob me parle un peu plus. Est-ce que vous pensez que redéfinir les bornes de la partie linéaire avec un MouseClick en codant le remplacement des coordonnées puis la modifications des courbes de tendances et enfin le recalcul des coefficients pourrait marcher ? Si c'est le cas, je partirai surement là-dessus pour avoir quelque chose de fonctionnel, quitte à l'améliorer par la suite. Chaque jour j'apprends de nouvelles choses

    En tout cas merci de vos réponses

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Est-ce que vous pensez que redéfinir les bornes de la partie linéaire avec un MouseClick en codant le remplacement des coordonnées puis la modifications des courbes de tendances et enfin le recalcul des coefficients pourrait marcher ?
    Bonjour,

    Sous réserve de la complexité des calculs, si tu peux faire ce que tu envisages sur base du MouseClick, tu peux le faire aussi sur base d'un MouseMove c'est-à-dire à chaque changement de position du curseur.
    Cela montrera le déplacement d'un point en temps réel, ou presque, à condition que le temps du traitement entre chaque pixel soit bref ...
    ...

  8. #8
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonjour,

    Certes ce que je te propose n'est pas la solution à ton problème mais permet de bien comprendre toutes les possibilité de mousedowm/move/up etc en mode graphique. Si cela peut t'aider. Je m'en suis inspiré pour faire un programme de jeu avec graphiques variables entre autre.

    http://vb-helper.com/howto_net_drawing_framework.html

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 571
    Par défaut
    Pour la modification de la courbe, je ne vois qu'utiliser la position du curseur de la souris pour définir les nouvelles coordonnées d'un point (après clic) et mettre à jour et la table de données et la courbe en résultant

  10. #10
    Membre averti
    Femme Profil pro
    Geologue
    Inscrit en
    Août 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2022
    Messages : 12
    Par défaut
    Merci à tous,

    Après avoir longuement consulté la littérature et d'après vos conseils, j'ai appliqué la méthode de umfred avec le MouseClick proposé par Phil Rob.
    Je vous mets le code si ça vous intéresse

    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
    Private Sub ChartCourbePressio_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ChartCourbePressio.MouseClick
            ' Appel HitTest qui retourne l'objet sous le curseur
            Dim resultk As HitTestResult = ChartCourbePressio.HitTest(e.X, e.Y)
     
            ' Si la souris est sur un data point
            If resultk.ChartElementType = ChartElementType.DataPoint Then
                If resultk.Series.Name = "V = f(P)" Then
                    ' Chercher quel data point dans la series
                    Dim pointk1 As DataPoint = ChartCourbePressio.Series(0).Points(resultk.PointIndex)
                    Dim Coord
                    Coord = pointk1.XValue
     
                    ' ouvrir une fenêtre de dialogue
                    If MessageBox.Show("Voulez-vous remplacer V0,P0 par le point sélectionné ?", "Modification P0,V0 ou Pe,Ve", MessageBoxButtons.YesNo) = DialogResult.Yes Then
                        'chercher les coordonnées x,y dans le datagrid et cocher la case P0,V0 correspondante
     
                        For i = 0 To DataGridView1.Rows.Count - 1
                            If DataGridView1.Item(1, i).Value = Coord Then
                                DataGridView1.Item(5, i).Value = True
                            Else
                                DataGridView1.Item(5, i).Value = False
                            End If
                        Next
     
                    Else
     
                        If MessageBox.Show("Voulez-vous remplacer Ve,Pe par le point sélectionné ?", "Modification P0,V0 ou Pe,Ve", MessageBoxButtons.YesNo) = DialogResult.Yes Then
                            'chercher les coordonnées x,y dans le datagrid et cocher la case Pe,Ve correspondante
                            For i = 0 To DataGridView1.Rows.Count - 1
                                If DataGridView1.Item(1, i).Value = Coord Then
                                    DataGridView1.Item(6, i).Value = True
                                Else
                                    DataGridView1.Item(6, i).Value = False
                                End If
                            Next
                        Else
                        End If
                    End If
                End If
            End If
        End Sub
    ça n'est sûrement ni le plus court ni le plus propre mais ça fonctionne... alors vu le nombre de défis qui m'attendent encore je vais laisser en l'état et j'y reviendrai peut-être un jour quand je serai plus à l'aise avec la programmation !

    Merci Excalybur pour ton lien, il va me servir pour ma prochaine étape.

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

Discussions similaires

  1. Créer une courbe à partir d'une courbe existante
    Par Ninon-L dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/09/2018, 08h50
  2. Créer une grille à partir de points plot
    Par Chefcou dans le forum Calcul scientifique
    Réponses: 0
    Dernier message: 18/06/2012, 18h16
  3. [Débutant] Créer une image à partir de points de données
    Par cocanouar dans le forum Images
    Réponses: 1
    Dernier message: 13/11/2011, 13h25
  4. Créer une courbe à partir d'une base de données
    Par piwyangel dans le forum Langage
    Réponses: 10
    Dernier message: 26/09/2011, 10h32

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