none
graphe et courbe RRS feed

  • Question

  • Bonjour à tous !

    Je me poser une question à savoir comment tracer une courbe directement dans une application VB.

    j'ai par exemple un fichier texte dans lequel j'ai des donnée du type

     "1;20/11/2010 00:26:55"
    "0;20/11/2010 00:26:55"
    "1;20/11/2010 00:26:57"
    "0;20/11/2010 00:26:57"
    "1;20/11/2010 00:26:59"
    "0;20/11/2010 00:26:59"
    "1;20/11/2010 00:27:00"
    "0;20/11/2010 00:27:03"
    "1;20/11/2010 00:27:05"
    "0;20/11/2010 00:27:06"
    "1;20/11/2010 00:27:07"
    "0;20/11/2010 00:27:09"
    "1;20/11/2010 00:27:11"
    "0;20/11/2010 00:27:14"
    "1;20/11/2010 00:27:16"
    "0;20/11/2010 00:27:18"

    Le but etant de faire un graph avec deux axes le premier l'etat 0 OU 1 sur l'axe de Temps.

     

    Comment pourrai-je faire.

    jeudi 18 novembre 2010 23:29

Réponses

  • Bonjour Mini,

    Voici, testé, j'y ai passé beaucoup de temps, je ne fais pas plus, plus le temps :

    '
    Option Explicit On
    Public Class Form2
     ' contenu du fichier
     '1;20/11/2010 00:10:55
     '0;20/11/2010 02:20:55
     '1;20/11/2010 04:30:57
     '0;20/11/2010 06:35:57
     '1;20/11/2010 08:40:59
     '0;20/11/2010 10:45:59
     '1;20/11/2010 12:50:00
     '0;20/11/2010 14:55:03
     '1;20/11/2010 16:00:05
     '0;20/11/2010 18:05:06
     '1;20/11/2010 20:15:07
     '0;20/11/2010 21:25:09
     '1;20/11/2010 22:27:11
     '0;20/11/2010 23:29:14
     '1;20/11/2010 23:59:59
     '0;20/11/2010 23:59:59
     '
     Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      WindowState = FormWindowState.Maximized
      Me.BackColor = Color.White
     End Sub
    
    
     Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      'NOTA BENE
      ' Si la form doit être modifiée en taille, tout mettre en ratio selon cette dernière ...
      If WindowState = FormWindowState.Minimized Or WindowState = FormWindowState.Normal Then Exit Sub
      Dim nomDuFichier As String = "fichierGraph.txt"
      If System.IO.File.Exists(My.Application.Info.DirectoryPath & "\" & nomDuFichier) = False Then
       MsgBox("fichier inexistant, remédier ... ", vbExclamation)
       Exit Sub
      End If
      '
      If FileLen(My.Application.Info.DirectoryPath & "\" & nomDuFichier) < 21 Then
       MsgBox("fichier vide, remédier ... ", vbExclamation)
       Exit Sub
      End If
      '
      Dim ligne As String
      Dim ladate As String
      Dim col As Integer = 50
      Dim ligneTrace As Integer = Me.Height - 80
      Dim ligneEcrit As Integer = Me.Height - 60
      Dim large As Integer = 65
      Dim hh As Integer = 0
      Dim mn As Integer = 0
      Dim ss As Integer = 0
      Dim t As Double = 0
      Dim hauteur As Integer
      Dim h As Double = ligneTrace - 20 ' bandeau hauteur de traçage
      Dim laFonte = New System.Drawing.Font("Courier New", 8)
      Dim g As System.Drawing.Graphics
      g = Me.CreateGraphics()
      Dim i As Long
      Dim j As Long
      '
      g.Clear(Color.White)
      j = 0
      For i = 0 To ligneTrace Step 29 ' 1 pixel = 2 minutes
       g.DrawString(Format(j, "00") & "h00", laFonte, New SolidBrush(Color.Black), 2, i)
       j = j + 1
      Next
      hauteur = i
      '
      Dim p1 As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\" & nomDuFichier))
      While p1.Peek() >= 0 ' lecture
       ligne = p1.ReadLine()
       ladate = Mid(ligne, 3, 6) & Mid(ligne, 11, 2)
       If Mid(ligne, 1, 1) = "0" Then GoTo bas
       hh = CInt(Mid(ligne, 14, 2))
       mn = CInt(Mid(ligne, 17, 2))
       ss = CInt(Mid(ligne, 20, 2))
       t = (hh * 60 * 60) + (mn * 60) + ss ' secondes 
       If t <> 0 Then
        t = t \ 60 ' minutes
        t = t / 100 * 48.333333 ' 1 pixel = 48% d'1 minute
        t = System.Math.Round(t, 0)
       End If
       e.Graphics.DrawLine(Pens.Black, col, ligneTrace, col, CInt(t))
       e.Graphics.DrawLine(Pens.Black, col, CInt(t), col + large, CInt(t))
       e.Graphics.DrawLine(Pens.Black, col + large, CInt(t), col + large, ligneTrace)
       GoTo fin
    bas: e.Graphics.DrawLine(Pens.Black, col, ligneTrace, col + large, ligneTrace)
    fin: g.DrawString(ladate, laFonte, New SolidBrush(Color.Black), col, ligneEcrit)
       col = col + large
       If col > Me.Width Then Exit While
      End While
      p1.Close()
      g.Dispose()
     End Sub
    
    End Class
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe mercredi 24 novembre 2010 11:36
    • Marqué comme réponse Alex Petrescu mercredi 24 novembre 2010 12:56
    lundi 22 novembre 2010 11:39

Toutes les réponses

  • Bonjour Mini,

    Tu parles de graphique et de courbes, pour le graphique (type température) avec éventuellement arrondi des sommets je vois, mais pour les courbes (arc de cercle) je ne suis pas certain de voir, par exemple, faudrait-il changer les heures en degrés d'angle pour faire un arc de cercle ?

    Peux-tu faire un petit croquis manuel, scanné (sauf si tu as une tablette) et le déposer ici, lui ou le lien, car en matière de géométrie on comprend mieux avec un dessin :o)

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 19 novembre 2010 08:19
  • Le 19/11/2010 00:29, nini06700 a écrit :
    > Bonjour à tous !
     
    Bonjour,
     
    > Je me poser une question à savoir comment tracer une courbe directement
    > dans une application VB.
     
    Si l'utilisation du framework 3.5 n'est pas un obstacle :
     
    --
    Fred
    foleide@free.fr
     
    vendredi 19 novembre 2010 09:47
  • Bonjour,

    Tu as un exemple ici:

    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.painteventargs.graphics%28VS.85%29.aspx

    la méthode est celle-ci:

    Dim RcDraw As Rectangle
    Dim PenWidth As Integer = 5
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
     System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
     ' Lire les éléments de ton fichier puis les dessiner
     e.Graphics.DrawRectangle(New Pen(Color.Blue, PenWidth), RcDraw)
    End Sub

    vendredi 19 novembre 2010 12:40
  • Voici comment je dessine un damier:


    Private Sub MainForm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
      Dim i As Byte
      For i = 0 To 16
       e.Graphics.DrawLine(Pens.Black, 10, 50 + (i * 40), (4 * 150) + 50, 50 + (i * 40))
       e.Graphics.DrawLine(Pens.Black, 10 + (i * 40), 50, 10 + (i * 40), (4 * 150) + 90)
      Next
     End Sub


    fred
    vendredi 19 novembre 2010 13:34
  • http://imagik.fr/view-rl/327428 En faite il s'agit de graf carré avec un etat 1 ou 0 sur le temps.
    vendredi 19 novembre 2010 18:33
  • Bonjour Mini,

    Ben alors il n'y a pas de courbers, voir l'exemple de Fred dans ce cas.

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 19 novembre 2010 19:47
  • bonjour,

    j'ai donc regarder un petit peu la solution du framework 3.5 la question que je me pose et comment integrer le fait d'aller chercher mes valeur dans un fichier txt avec mon type de trame?

    Merci pour les infos

    samedi 20 novembre 2010 17:07
  • Bonjour Mini,

    Je ne suis pas certain de comprendre, tu voudrais savoir comment lire un fichier texte, ou seulement comment séparer les éléments de chaque ligne de façon à les utiliser, ou les deux ?

    Sinon, après avoir regardé ton dessin, en effet, les lignes montrées par "Fred" sont l'idéal, toutefois sur un plan pratique tu veux afficher des heures avec une précision à la seconde, ce qui fait (24 * 60 * 60) = 86.400, or tu n'as pas autant de pixels que ça dans ta hauteur, ah ... Le maximum que tu puises faire sur 24h00 avec des minutes, c'est toutes les trois minutes environ, as-tu pensé à ce problème, à moins que ce ne soit pas sur 24h00 ?

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    samedi 20 novembre 2010 20:03
  • bonsoir

    En fait il s'agit d'utilisé les données d'un fichier txt et de prendre en compte les valeurs sur une periode à definir (je sait pas encore comment et suite a sa tracer les différents résultat de la periode demander.

    je n'est pas le niveau mais j'avoue que sa pourrai etre un plus pour mon petit logiciel si on peut appeler sa comme sa...

    Merci de prendre encompte mon probléme Ehjoe sur répond trés souvent à mes questions.

    dimanche 21 novembre 2010 22:18
  • Bonjour Mini,

    Voici, testé, j'y ai passé beaucoup de temps, je ne fais pas plus, plus le temps :

    '
    Option Explicit On
    Public Class Form2
     ' contenu du fichier
     '1;20/11/2010 00:10:55
     '0;20/11/2010 02:20:55
     '1;20/11/2010 04:30:57
     '0;20/11/2010 06:35:57
     '1;20/11/2010 08:40:59
     '0;20/11/2010 10:45:59
     '1;20/11/2010 12:50:00
     '0;20/11/2010 14:55:03
     '1;20/11/2010 16:00:05
     '0;20/11/2010 18:05:06
     '1;20/11/2010 20:15:07
     '0;20/11/2010 21:25:09
     '1;20/11/2010 22:27:11
     '0;20/11/2010 23:29:14
     '1;20/11/2010 23:59:59
     '0;20/11/2010 23:59:59
     '
     Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      WindowState = FormWindowState.Maximized
      Me.BackColor = Color.White
     End Sub
    
    
     Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      'NOTA BENE
      ' Si la form doit être modifiée en taille, tout mettre en ratio selon cette dernière ...
      If WindowState = FormWindowState.Minimized Or WindowState = FormWindowState.Normal Then Exit Sub
      Dim nomDuFichier As String = "fichierGraph.txt"
      If System.IO.File.Exists(My.Application.Info.DirectoryPath & "\" & nomDuFichier) = False Then
       MsgBox("fichier inexistant, remédier ... ", vbExclamation)
       Exit Sub
      End If
      '
      If FileLen(My.Application.Info.DirectoryPath & "\" & nomDuFichier) < 21 Then
       MsgBox("fichier vide, remédier ... ", vbExclamation)
       Exit Sub
      End If
      '
      Dim ligne As String
      Dim ladate As String
      Dim col As Integer = 50
      Dim ligneTrace As Integer = Me.Height - 80
      Dim ligneEcrit As Integer = Me.Height - 60
      Dim large As Integer = 65
      Dim hh As Integer = 0
      Dim mn As Integer = 0
      Dim ss As Integer = 0
      Dim t As Double = 0
      Dim hauteur As Integer
      Dim h As Double = ligneTrace - 20 ' bandeau hauteur de traçage
      Dim laFonte = New System.Drawing.Font("Courier New", 8)
      Dim g As System.Drawing.Graphics
      g = Me.CreateGraphics()
      Dim i As Long
      Dim j As Long
      '
      g.Clear(Color.White)
      j = 0
      For i = 0 To ligneTrace Step 29 ' 1 pixel = 2 minutes
       g.DrawString(Format(j, "00") & "h00", laFonte, New SolidBrush(Color.Black), 2, i)
       j = j + 1
      Next
      hauteur = i
      '
      Dim p1 As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\" & nomDuFichier))
      While p1.Peek() >= 0 ' lecture
       ligne = p1.ReadLine()
       ladate = Mid(ligne, 3, 6) & Mid(ligne, 11, 2)
       If Mid(ligne, 1, 1) = "0" Then GoTo bas
       hh = CInt(Mid(ligne, 14, 2))
       mn = CInt(Mid(ligne, 17, 2))
       ss = CInt(Mid(ligne, 20, 2))
       t = (hh * 60 * 60) + (mn * 60) + ss ' secondes 
       If t <> 0 Then
        t = t \ 60 ' minutes
        t = t / 100 * 48.333333 ' 1 pixel = 48% d'1 minute
        t = System.Math.Round(t, 0)
       End If
       e.Graphics.DrawLine(Pens.Black, col, ligneTrace, col, CInt(t))
       e.Graphics.DrawLine(Pens.Black, col, CInt(t), col + large, CInt(t))
       e.Graphics.DrawLine(Pens.Black, col + large, CInt(t), col + large, ligneTrace)
       GoTo fin
    bas: e.Graphics.DrawLine(Pens.Black, col, ligneTrace, col + large, ligneTrace)
    fin: g.DrawString(ladate, laFonte, New SolidBrush(Color.Black), col, ligneEcrit)
       col = col + large
       If col > Me.Width Then Exit While
      End While
      p1.Close()
      g.Dispose()
     End Sub
    
    End Class
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe mercredi 24 novembre 2010 11:36
    • Marqué comme réponse Alex Petrescu mercredi 24 novembre 2010 12:56
    lundi 22 novembre 2010 11:39