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 :

Comment dessiner une courbe à trois paramètres?


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Comment dessiner une courbe à trois paramètres?
    Slt, je suis encore débutante et je souhaite savoir comment on dessine une courbe en vb.net.
    disons que l'axe des abscisses correspond au temps(jour ou semaine ou heure ou mois ou années)
    l'axe des ordonnées a gauche correspond au champs quantités et a droite le champs prix.
    jen ai aucune idée comment dessiner cette courbe
    et je souhaite aussi savoir, si c possible, que quand on met le curseur sur un point de la courbe, on obtient comme une information
    Merci de m'aider ca sera super gentiiiiiiiiiiiil

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    C'est tellement difficile de faire ca ou quoi ?
    please un article, un exemple me serait bénéfique
    Merci a vous

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Pas de questions techniques par MP

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Sauf que s'il y a trois points, ça se passe dans l'espace alors que les méthodes de Graphics ne sont que pour de la 2D.
    Normalement avec WPF on peut faire de la 3D alors ça doit pouvoir être possible avec ...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par NoussaL Voir le message
    C'est tellement difficile de faire ca ou quoi ?
    please un article, un exemple me serait bénéfique
    Merci a vous
    désolé j'suis pas tellement sur le forum en ce moment lol

    Citation Envoyé par smyley Voir le message
    Sauf que s'il y a trois points, ça se passe dans l'espace alors que les méthodes de Graphics ne sont que pour de la 2D.
    Normalement avec WPF on peut faire de la 3D alors ça doit pouvoir être possible avec ...
    il doit etre possible de calculer le rendu 2d à partir de la 3d lol



    s'il te faut 2 axes, voici un code que j'avais fait pour des courbes
    pas forcément le mieux, pas forcément adapté à ton code, mais ca donne une idée, et j'affichais les coordonnées du point le plus proche selon le mouvement de la souris



    classe de stockage des points
    (pour comparer en temps réel qui est le point le plus proche, il faut les garder en mémoire et pas seulement déssiner)
    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
     
    Public Class Courbe
     
     
     
        Private Sub New()
        End Sub
     
        Public Sub New(ByVal capt As Capteur, ByVal deb As Date, ByVal fin As Date)
            _Points = Me.CreatePoints(capt.IDCapteur, deb, fin)
            _Capteur = capt
        End Sub
     
        Private _Points As System.Collections.Generic.Dictionary(Of Date, Object)
        Public ReadOnly Property Points() As System.Collections.Generic.Dictionary(Of Date, Object)
            Get
                Return _Points
            End Get
        End Property
     
        Private _Capteur As Capteur
        Public ReadOnly Property Capteur() As Capteur
            Get
                Return _Capteur
            End Get
        End Property
     
     
     
     
     
        Public Shared ReadOnly Property GetCoord(ByVal deb As Date, ByVal fin As Date, ByVal valeur As Date, ByVal largeurctrl As Integer) As Integer
            Get
                Return CInt(DateDiff(DateInterval.Minute, deb, valeur) / DateDiff(DateInterval.Minute, deb, fin) * largeurctrl)
            End Get
        End Property
     
        Public Shared ReadOnly Property GetCoord(ByVal deb As Decimal, ByVal fin As Decimal, ByVal valeur As Decimal, ByVal hauteurctrl As Integer) As Integer
            Get
                Return CInt((fin - valeur) / (fin - deb) * hauteurctrl)
            End Get
        End Property
     
     
     
     
     
        Public Function CreatePoints(ByVal IDcapteur As Integer, ByVal deb As Date, ByVal fin As Date) As System.Collections.Generic.Dictionary(Of Date, Object)
            CreatePoints = New System.Collections.Generic.Dictionary(Of Date, Object)
            Dim pdeb As New System.Data.SqlClient.SqlParameter("@deb", deb)
            Dim pfin As New System.Data.SqlClient.SqlParameter("@fin", fin)
            Dim dtPoints As System.Data.DataTable = DB.ExecuteReader("SELECT DateHeure,Valeur FROM ValeursEnregistrements WHERE IDcapteur = " & IDcapteur & " AND DateHeure>=@deb AND DateHeure<=@fin ORDER BY DateHeure", pdeb, pfin)
            Dim d As Date
            Dim v As Object
            For Each ligne As System.Data.DataRow In dtPoints.Rows
                d = CDate(ligne.Item(0))
                v = ligne.Item(1)
                CreatePoints.Add(d, v)
                If Not TypeOf v Is Decimal Then Continue For
                If CDec(v) < _minvalue Then _minvalue = CDec(v)
                If CDec(v) > _maxvalue Then _maxvalue = CDec(v)
            Next
            Return CreatePoints
        End Function
     
        Private _minvalue As Decimal
        Public ReadOnly Property minvalue() As Decimal
            Get
                Return _minvalue
            End Get
        End Property
     
        Private _maxvalue As Decimal
        Public ReadOnly Property maxvalue() As Decimal
            Get
                Return _maxvalue
            End Get
        End Property
     
     
    End Class


    controle de dessin :
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    Public Class GraphCourbes
        Inherits System.Windows.Forms.Control
     
        Public Enum Position
            gauche = 0
            droite = 1
        End Enum
     
     
        Private Class EchelleDeTemps
            Public DateDeb As Date
            Public DateFin As Date
            Public CtrlWidth As Integer
            Public Shared Hauteur As Integer = 30
            Public ReadOnly Property ValeursIntervals() As System.Collections.Generic.List(Of Date)
                Get
                    Dim minutes As Long
                    Minutes = DateDiff(DateInterval.Minute, Me.DateDeb, Me.DateFin)
                    Select Case Minutes
                        Case Is < 35
                            Minutes = 5
                        Case Is < 70
                            Minutes = 10
                        Case Is < 140
                            Minutes = 20
                        Case Is < 7 * 60
                            Minutes = 60
                        Case Is < 15 * 60
                            Minutes = 2 * 60
                        Case Is < 24 * 60
                            Minutes = 4 * 60
                        Case Is < 2 * 24 * 60
                            Minutes = 6 * 60
                        Case Is < 4 * 24 * 60
                            Minutes = 12 * 60
                        Case Is < 8 * 24 * 60
                            Minutes = 24 * 60
                        Case Is < 15 * 24 * 60
                            Minutes = 2 * 24 * 60
                        Case Is < 23 * 24 * 60
                            Minutes = 4 * 24 * 60
                        Case Is < 40 * 24 * 60
                            Minutes = 7 * 24 * 60
                        Case Else
                            Minutes = Minutes \ 60 \ 7
                    End Select
     
                    ValeursIntervals = New System.Collections.Generic.List(Of Date)
                    Dim i As Date = Me.DateDeb
                    i = Me.DateDeb.AddSeconds(-Me.DateDeb.Second)
                    If minutes < 60 Then
                        i = i.AddMinutes(-i.Minute Mod 10)
                        If i.Minute Mod 10 = 0 Then
     
                        End If
                        'i = DateAdd(DateInterval.Minute,datediff(DateInterval.Minute, Me.DateDeb.Minute 
                    Else
     
                    End If
                    While i <= Me.DateFin
                        i = i.AddMinutes(minutes)
                        ValeursIntervals.Add(i)
                    End While
     
                    Return ValeursIntervals
                End Get
            End Property
            Public Sub AjouteTailleEchelle(ByVal Width As Integer, ByVal x2 As Boolean)
                Me.DateDeb = Me.DateDeb.AddMinutes(-Me.CtrlWidth * Width / DateDiff(DateInterval.Minute, Me.DateDeb, Me.DateFin))
                If x2 Then Me.DateFin = Me.DateFin.AddMinutes(-Me.CtrlWidth * Width / DateDiff(DateInterval.Minute, Me.DateDeb, Me.DateFin))
            End Sub
        End Class
     
        Private Class Echelle
            Public Position As Position
            Public ValeurMin As Decimal
            Public ValeurMax As Decimal
            Public CtrlHeight As Integer
            Public Unite As String
            Public Shared Largeur As Integer = 40
            Public ReadOnly Property ValeursIntervals() As System.Collections.Generic.List(Of Decimal)
                Get
                    Dim interval As Double
                    interval = (Me.ValeurMax - Me.ValeurMin) / 8
                    Select Case interval
                        Case Is < 0.3
                            interval = 0.1
                        Case Is < 0.4
                            interval = 0.25
                        Case Is < 0.7
                            interval = 0.5
                        Case Is < 0.8
                            interval = 0.75
                        Case Is < 1.3
                            interval = 1
                        Case Is < 3
                            interval = 2
                        Case Is < 8
                            interval = 5
                        Case Is < 15
                            interval = 10
                        Case Else
                            interval = (CLng(interval) \ 10) * 10
                    End Select
     
                    ValeursIntervals = New System.Collections.Generic.List(Of Decimal)
                    Dim i As Decimal = System.Math.Round(Me.ValeurMin, 0)
                    While i <= Me.ValeurMax
                        i += CDec(interval)
                        ValeursIntervals.Add(i)
                    End While
     
                    Return ValeursIntervals
                End Get
            End Property
            Public Sub AjouteTailleEchelleDeTemps(ByVal height As Integer)
                Me.ValeurMin -= System.Math.Round((height * (Me.ValeurMax - Me.ValeurMin)) / Me.CtrlHeight, 2)
            End Sub
        End Class
     
     
     
     
     
     
        Public Sub New()
            Me.BackColor = Color.White
            _CentrageTexte.Alignment = StringAlignment.Center
            _CentrageTexte.LineAlignment = StringAlignment.Center
        End Sub
     
     
        Private _CentrageTexte As New System.Drawing.StringFormat
     
        Private _buffer As System.Drawing.BufferedGraphics
        Private _courbes As System.Collections.Generic.List(Of Courbe)
        Private _ddeb As Date
        Private _dfin As Date
     
        Private _Echelles As New System.Collections.Generic.Dictionary(Of String, Echelle)
        Private _EchelleTemps As EchelleDeTemps
     
        Public Sub TraceCourbes(ByVal courbes As System.Collections.Generic.List(Of Courbe), ByVal ddeb As Date, ByVal dfin As Date)
            Try
     
                _courbes = Nothing
                _ddeb = Nothing
                _dfin = Nothing
                _Echelles.Clear()
                _buffer.Graphics.Clear(Me.BackColor)
                _buffer.Render()
     
                If courbes Is Nothing Then Exit Sub
                If courbes.Count = 0 Then Exit Sub
                If ddeb = Nothing Then Exit Sub
                If dfin = Nothing Then Exit Sub
     
                _courbes = courbes
                _ddeb = ddeb
                _dfin = dfin
                _EchelleTemps = New EchelleDeTemps()
                _EchelleTemps.DateDeb = ddeb
                _EchelleTemps.DateFin = dfin
                _EchelleTemps.CtrlWidth = Me.Width
     
                For Each crb As Courbe In courbes
                    If _Echelles.ContainsKey(crb.Capteur.Unite) Then
                        If crb.minvalue < _Echelles(crb.Capteur.Unite).ValeurMin Then _Echelles(crb.Capteur.Unite).ValeurMin = crb.minvalue
                        If crb.minvalue < _Echelles(crb.Capteur.Unite).ValeurMin Then _Echelles(crb.Capteur.Unite).ValeurMin = crb.minvalue
                        Continue For
                    End If
                    If _Echelles.Count >= 4 Then
                        'MSGS.AfficheMessage("Il ne peut y avoir que 4 types d'échelles en même temps sur un graphique" & vbCrLf & "La courbe " & crb.Capteur.Nom_Capteur & " ne sera pas tracée", "Trop de courbes différentes")
                        ' todo : arreter tout et décocher la courbe en question (donc rappel de cette sub)
                    End If
                    Dim ech As New Echelle
                    ech.Position = CType(_Echelles.Count Mod 2, Position)
                    ech.CtrlHeight = Me.Height
                    ech.Unite = crb.Capteur.Unite
                    ech.ValeurMin = crb.minvalue
                    ech.ValeurMax = crb.maxvalue
                    _Echelles.Add(crb.Capteur.Unite, ech)
                Next
     
     
                For Each ech As Echelle In _Echelles.Values
                    If ech.ValeurMax = ech.ValeurMin Then Continue For
                    ech.AjouteTailleEchelleDeTemps(EchelleDeTemps.Hauteur)
                Next
                _EchelleTemps.AjouteTailleEchelle(Echelle.Largeur, (_Echelles.Count > 1))
     
                RefreshGraph()
            Catch ex As Exception
                SaveErreur(ex, Me)
            End Try
        End Sub
     
     
     
        Public Sub Print(ByVal g As System.Drawing.Graphics)
            Try
     
            Catch ex As Exception
                SaveErreur(ex, Me)
            End Try
        End Sub
     
     
        Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaintBackground(pevent)
            AppliqueBuffer()
        End Sub
     
     
        Private Sub AppliqueBuffer()
            If _buffer IsNot Nothing Then _buffer.Render()
            If ptproche <> Nothing Then Me.CreateGraphics.DrawEllipse(New System.Drawing.Pen(_couleurptproche), ptproche.X - 3, ptproche.Y - 3, 6, 6)
            If ptproche <> Nothing Then Me.CreateGraphics.DrawEllipse(New System.Drawing.Pen(_couleurptproche), ptproche.X - 2, ptproche.Y - 2, 4, 4)
        End Sub
     
        Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
            MyBase.OnSizeChanged(e)
            If _buffer IsNot Nothing Then _buffer.Dispose()
            _buffer = System.Drawing.BufferedGraphicsManager.Current.Allocate(Me.CreateGraphics, New System.Drawing.Rectangle(0, 0, Me.Width, Me.Height))
            _buffer.Graphics.Clear(Me.BackColor)
            If _courbes IsNot Nothing Then TraceCourbes(_courbes, _ddeb, _dfin)
        End Sub
     
     
     
     
        Public Sub RefreshGraph()
            _buffer.Graphics.Clear(Me.BackColor)
            _buffer.Render()
            If _courbes.Count = 0 Then Exit Sub
     
     
            TraceAxes()
     
     
            For Each ech As Echelle In _Echelles.Values
                TraceEchelle(ech)
            Next
            TraceEchelleTemps()
     
     
            For Each crb As Courbe In _courbes
                TraceCourbe(crb)
            Next
     
     
            _buffer.Render()
        End Sub
     
     
     
        Private Sub TraceAxes()
            _buffer.Graphics.DrawLine(Pens.Black, Echelle.Largeur, Me.Height - EchelleDeTemps.Hauteur, Echelle.Largeur, 0) ' pour verticale echelle de temps de gauche
            If _Echelles.Count = 1 Then
                _buffer.Graphics.DrawLine(Pens.Black, Echelle.Largeur, Me.Height - EchelleDeTemps.Hauteur, Me.Width, Me.Height - EchelleDeTemps.Hauteur)   ' pour horizontale au dessus de echelle de temps
            Else
                _buffer.Graphics.DrawLine(Pens.Black, Echelle.Largeur, Me.Height - EchelleDeTemps.Hauteur, Me.Width - Echelle.Largeur, Me.Height - EchelleDeTemps.Hauteur)   ' pour horizontale au dessus de echelle de temps
                _buffer.Graphics.DrawLine(Pens.Black, Me.Width - Echelle.Largeur, Me.Height - EchelleDeTemps.Hauteur, Me.Width - Echelle.Largeur, 0) ' pour verticale echelle de temps de droite
            End If
        End Sub
     
        Private Sub TraceEchelle(ByVal ech As Echelle)
            If ech.ValeurMin = ech.ValeurMax Then Exit Sub
            Dim tirets As New System.Drawing.Pen(Color.Black, 1)
            tirets.DashStyle = Drawing2D.DashStyle.Dash
            tirets.DashPattern = New Single(1) {3, 5}
            Dim coul As System.Drawing.Color
            Dim droite As Integer = Me.Width
            If _Echelles.Count > 1 Then droite = Me.Width - Echelle.Largeur
            Dim xtexte As Integer
            If ech.Position = Position.gauche Then
                coul = Color.Blue
                '                    coul = Color.DarkGray
                xtexte = Echelle.Largeur \ 3
            Else
                coul = Color.Brown
                '                    coul = Color.DarkKhaki
                xtexte = Me.Width - Echelle.Largeur \ 3
            End If
            For Each interval As Decimal In ech.ValeursIntervals
                tirets.Color = coul
                _buffer.Graphics.DrawLine(tirets, Echelle.Largeur, Courbe.GetCoord(ech.ValeurMin, ech.ValeurMax, interval, Me.Height), droite, Courbe.GetCoord(ech.ValeurMin, ech.ValeurMax, interval, Me.Height))
                _buffer.Graphics.DrawString(interval.ToString, Me.Font, New System.Drawing.SolidBrush(coul), xtexte, Courbe.GetCoord(ech.ValeurMin, ech.ValeurMax, interval, Me.Height), _CentrageTexte)
            Next
        End Sub
     
        Private Sub TraceEchelleTemps()
            For Each interval As Date In _EchelleTemps.ValeursIntervals
                _buffer.Graphics.DrawLine(Pens.Black, Courbe.GetCoord(_EchelleTemps.DateDeb, _EchelleTemps.DateFin, interval, Me.Width), Me.Height - EchelleDeTemps.Hauteur + 5, Courbe.GetCoord(_EchelleTemps.DateDeb, _EchelleTemps.DateFin, interval, Me.Width), Me.Height - EchelleDeTemps.Hauteur)
                _buffer.Graphics.DrawString(interval.ToString, Me.Font, Brushes.Black, Courbe.GetCoord(_EchelleTemps.DateDeb, _EchelleTemps.DateFin, interval, Me.Width), Me.Height - EchelleDeTemps.Hauteur + 16, _CentrageTexte)
            Next
        End Sub
     
        Private Sub TraceCourbe(ByVal crb As Courbe)
            Dim lastdateON As Date = Nothing
            Dim lastPoint As System.Drawing.Point
            Dim currentPoint As System.Drawing.Point
     
            For Each d As Date In crb.Points.Keys
     
                If crb.Points(d) Is System.DBNull.Value Then  ' si pas de point enregistré 
                    If lastdateON = Nothing Then ' si pas de point avant
                        Continue For
                    End If
     
                    ' si un point avant
                    ' pour couleur auto :  Courbe.Couleurs(ncourbe)
                    '_buffer.Graphics.DrawLine(New System.Drawing.Pen(crb.Capteur.Couleur), lastPoint, lastPoint)
                    If Not lastdateON = Nothing Then
                        _buffer.Graphics.DrawRectangle(New System.Drawing.Pen(crb.Capteur.Couleur), lastPoint.X - 2, lastPoint.Y - 2, 4, 4)
                    End If
                    lastdateON = Nothing
                    lastPoint = Nothing
                    Continue For
                End If
     
     
                ' si un point existe 
                currentPoint.X = Courbe.GetCoord(_ddeb, _dfin, d, Me.Width)
                currentPoint.Y = Courbe.GetCoord(_Echelles(crb.Capteur.Unite).ValeurMin, _Echelles(crb.Capteur.Unite).ValeurMax, CDec(crb.Points(d)), Me.Height)
     
                If lastdateON <> Nothing Then ' si un point avant
                    _buffer.Graphics.DrawRectangle(New System.Drawing.Pen(crb.Capteur.Couleur), lastPoint.X - 2, lastPoint.Y - 2, 4, 4)
                    _buffer.Graphics.DrawLine(New System.Drawing.Pen(crb.Capteur.Couleur), lastPoint, currentPoint)
                End If
     
                lastdateON = d
                lastPoint = currentPoint
                Continue For
     
            Next
        End Sub
     
     
     
        Private ptproche As System.Drawing.Point
        Private _couleurptproche As System.Drawing.Color
     
        Public Event PointProcheChanged(ByVal sender As Object, ByVal ptText As String)
     
        Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseMove(e)
     
            If _courbes Is Nothing Then Exit Sub
            If _courbes.Count = 0 Then Exit Sub
     
            ptproche = Nothing
     
            Dim mindist As Decimal = 1000
            Dim crbmindist As Courbe = Nothing
            Dim datemindist As Date
            Dim pt As System.Drawing.Point = Nothing
     
            For Each crb As Courbe In _courbes
                For Each d As Date In crb.Points.Keys
                    If crb.Points(d) Is System.DBNull.Value Then Continue For
     
                    If _Echelles(crb.Capteur.Unite).ValeurMin = _Echelles(crb.Capteur.Unite).ValeurMax Then Continue For
     
                    pt.X = Courbe.GetCoord(_ddeb, _dfin, d, Me.Width)
                    pt.Y = Courbe.GetCoord(_Echelles(crb.Capteur.Unite).ValeurMin, _Echelles(crb.Capteur.Unite).ValeurMax, CDec(crb.Points(d)), Me.Height)
     
                    If calcdistance(e.Location, pt) < mindist Then
                        mindist = calcdistance(e.Location, pt)
                        crbmindist = crb
                        datemindist = d
                    End If
                Next
            Next
     
     
            Dim texte As String
            If datemindist = Nothing Then
                texte = ""
            Else
                pt.X = Courbe.GetCoord(_ddeb, _dfin, datemindist, Me.Width)
                pt.Y = Courbe.GetCoord(_Echelles(crbmindist.Capteur.Unite).ValeurMin, _Echelles(crbmindist.Capteur.Unite).ValeurMax, CDec(crbmindist.Points(datemindist)), Me.Height)
                ptproche = pt
                _couleurptproche = System.Drawing.Color.FromArgb(255 - crbmindist.Capteur.Couleur.R, 255 - crbmindist.Capteur.Couleur.G, 255 - crbmindist.Capteur.Couleur.B)
                AppliqueBuffer()
                'Me.CreateGraphics.DrawEllipse(Pens.Brown, pt.X - 2, pt.Y - 2, 4, 4)
                texte = datemindist.Date & " " & datemindist.Hour & ":" & Microsoft.VisualBasic.Right("0" & datemindist.Minute, 2) & "  " & CDec(crbmindist.Points(datemindist)) & " " & crbmindist.Capteur.Unite
            End If
     
            RaiseEvent PointProcheChanged(Me, texte)
        End Sub
     
        Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
            MyBase.OnMouseLeave(e)
            ptproche = Nothing
            AppliqueBuffer()
            RaiseEvent PointProcheChanged(Me, "")
        End Sub
     
     
        Private Function calcdistance(ByVal ptsouris As System.Drawing.Point, ByVal pt As System.Drawing.Point) As Decimal
            Return CDec(System.Math.Sqrt(System.Math.Pow(ptsouris.X - pt.X, 2) + System.Math.Pow(ptsouris.Y - pt.Y, 2)))
        End Function
     
    End Class

    désolé pour les pavés

    ce controle me parmétait d'afficher x courbes avec 4 échelles différentes (2 à gauche et 2 à droite), enfin peut etre que c'est pas fini et que j'avais développé que pour 2 échelles
    et j'avais un autre controle qui permettait de sélectionner les courbes dans une liste et de choisir de quand à quand

    les classes d'échelles permettent d'afficher l'echelle sur des nombres ronds


    sinon il y a une dll gratuite je crois, qui doit s'appeler ZedGraph qui permet de faire plein de choses style courbes, histogrammes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Je vous remercie, je vais essayer ça malgré ce que je cherche est beaucoup plus simple que ça.
    car tout ce que je veux faire c'est un axe de temps horizontal et deux axes verticales.
    Les coordonnées des points je les garde dans une liste d'objets.
    chaque objet a trois paramètres a présenter sur la courbe(temps, Qté et prix)
    Donc je dois présenter la courbe de ses objets!
    désolé si j'écris brièvement ou avec de fautes d'orthographes , on est souvent pressé

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    alors mon code devrait t'aller (en le simplifiant un peu), à part que moi, à la place d'un tableau à 3 colonnes, j'aurais 2 tableaux de type date/valeur

    mais sinon je ne fais que calculer l'echelle(s) à partir des min et max, dessiner les courbes et des petits rond sur les point, et sur le mousemove, je recherche le point le plus proche pour mettre le rond d'une autre couleur et afficher les valeurs dans un textbox
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    je suis vraiment coincée
    En fait ce que j'ai fait, c'est d'intégrer une bibliothèque de composant personnalisé WPF dans mon simple windows form afin de profiter des apports graphiques du WPF.
    Donc je vais dessiner mes courbes dans ce composant WPF, j'ai trouvé du code pour dessiner ce qu'on appelle polyline(courbe)mais le problème c'est je veux dessiner une courbe d'historique, et comme j'ai déjà expliqué; elle est en fonction du temps et cet axe change ça peut être mois, heures ,jours ou même des années!!!!! comment je dois choisir le repère.
    disons que mes points sont de coordonnées comme suit
    A( 24/08/2007 12:13:10 , 13, 3,7)
    B( 24/08/2007 01:15:40 , 300, 28)
    C(24/08/2008 12:15:10 , 34, 30)
    en fait les coordonnées peuvent être de n'importe quel valeurs car ce sont les stocks d'une application financière, j'ai trouvé des applications qui correspondent a ça et faite de manière agréable mais y a aucun code
    De l'aide s'il vous plait, déjà j'ai jamais utilisé WPF et je me sens bloquée
    Merciiiiiiiiii d'avance

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    utiliser du wpf dans une appli windows forms, n'apportent pas totalement de choses, car le wpf n'utilises alors pas directX, mais est rendu comme du windows forms, via GDI+
    donc niveau perf c'est pas top
    m'enfin ca peut se faire quand même

    sinon si tu prends le temps de lire mon code et que t'arrives à le comprendre, tu verras comment est créée l'échelle en fonction des valeurs des points et des dates

    il suffit de calculer l'amplitude, de l'agrandir un peu histoire de bien voir la courbe (ajoute un pourcentage de chaque coté)
    puis calculer des points intermédiaires qui seront affiché en légende sur l'echelle

    (mais y a ptete des trucs automatique pour gérer l'echelle, surtout en wpf, moi j'ai tout fait "à la main")
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    oui justement, je cherche un logiciel ou un truc free qui fait ca car je pense que c'est pas simple du tout de dessiner ca manuellement, imagine que ma base contient des milliers de lignes genre un historique de plusque 10 ans!!! et puis je cherche une bonne qualité de présentation des courbes, genre des indications sur la courbe, du zooming...
    j'ai trouvé des trucs free mais pour des applications web ce qui ne correspond pas a mes windows forms et ceux que j'ai trouvé pour les desktop sont plus que chèèèèèèèèèèers.
    Je ne sais pas quoi faire

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    t'as regardé ZedGraph ?

    et puis que ta base de données soit vide ou pleine, ca ne change rien au code, je vois pas le rapport
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    En fait, je parlais de la base car j'ai pensé que le nombre de points et la différence entre les coordonnées ca posera un problème de choix de repère, d'altitude et de la taille de la courbe.
    Sinon je n'ai pas vu auparavant Zgraph mais la je suis entrain de voir quelques exemples sur ca. Je ne sais pas encore si ca convient, mais je te donne un exemple d'outil qui correspond parfaitement a mon besoin mais malheureusement c'est destiné web, je parle de amChart
    Bon je vais voir zgraph de plus prés.
    Je te remercie infiniment pour ton aide qui me sera toujours utile

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Je te remercie infiniment, j'ai essayé zgraph et il fait a peu prés ce que je cherche. C'est juste qu'il y a une petite chose qui m'échappe.
    En fait je veux savoir comment effacer le graphe pour dessiner un nouveau, car j'ai un petit menu qui change la période de temps, c'est pour car a chaque clic je veux dessiner un nouveau graphe selon la période choisie.

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/07/2008, 08h39
  2. Réponses: 3
    Dernier message: 26/01/2006, 10h55
  3. Comment passer une procédure en paramètre ?
    Par gudul dans le forum Langage
    Réponses: 4
    Dernier message: 30/09/2005, 13h57
  4. Réponses: 3
    Dernier message: 29/06/2005, 14h29
  5. Comment dessiner une ligne dans un Chart ?
    Par libititi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2005, 14h56

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