Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

real time γραφημα σε visual basic 2010

Îåêßíçóå áðü ôï ìÝëïò bleo8onhs. Τελευταία δημοσίευση από το μέλος bleo8onhs στις 21-06-2010, 18:41. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-06-2010, 20:54 59213

    real time γραφημα σε visual basic 2010

    Καλησπέρα σας,
     
    προσπαθω να φτιάξω ένα γράφημα που θα απεικονίζει την θερμοκρασία του χώρου realtime. Σκέφτηκα να το κάνω με picturebox όπου θα "ζωγραφίζω" ένα pixel κάθε δεύτερο (με timer) με χ κάθε φορά το επόμενο και y την θερμοκρασία (την οποία παίρνω από phidget).

    Το picturebox όταν φτάνει στο τέλος πρέπει να σβήνει ένα ένα από την αρχη ή να έχει scroll (καλύτερο αυτό).

    Μήπως μπορείτε να με βοηθήσετε με το picturebox? Να μου προτείνετε ένα tutorial ή κάτι τέτοιο? Δοκίμασα το google αλλα ότι και να έβαλα δεν δούλεψε.

    Χρησιμοποιώ αυτο PictureBox1.Line (10,10)-(20,20) και αυτό PictureBox1.Pset (10,10), vbRed πχ αλλά μου λέει

    Error    1    'Line' is not a member of 'System.Windows.Forms.PictureBox'.  



    Δημοσίευση στην κατηγορία: ,
  •  20-06-2010, 14:46 59214 σε απάντηση της 59213

    Απ: real time γραφημα σε visual basic 2010

    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
     
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
    
            Dim tempValue As Integer
            Dim lightValue As Integer
    
            tempValue = Math.Round(phidgetIFK.sensors.Item(0).Value() * 0.2222 - 61.111, 2)
            lightValue = (phidgetIFK.sensors.Item(1).Value())
    
            values.Add(tempValue * 155 / 70)
            If values.Count = Me.PictureBox1.ClientSize.Width Then
                values.RemoveAt(0)
            End If
            Me.PictureBox1.Refresh()
    
            values2.Add(lightValue * 155 / 1000)
            If values2.Count = Me.PictureBox2.ClientSize.Width Then
                values2.RemoveAt(0)
            End If
            Me.PictureBox2.Refresh()
    
    
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    
            If values.Count > 1 Then
                Dim points As New List(Of Point)
                For x As Integer = 0 To values.Count - 1
                    points.Add(New Point(x, values(x)))
                Next
                e.Graphics.DrawLines(Pens.Red, points.ToArray)
            End If
        End Sub
    
    
        Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
    
            If values2.Count > 1 Then
                Dim points As New List(Of Point)
                For x As Integer = 0 To values2.Count - 1
                    points.Add(New Point(x, values2(x)))
                Next
                e.Graphics.DrawLines(Pens.Red, points.ToArray)
            End If
        End Sub
    Χρησιμοποιώ αυτόν τον κώδικα, μα κάτι γίνεται λάθος γιατί μου φαίνεται ότι ο y αξονας είναι ανάποδα..



  •  20-06-2010, 15:08 59215 σε απάντηση της 59214

    Απ: real time γραφημα σε visual basic 2010

    Σε μια γραφική παράσταση,οι τιμές του άξονα y αυξάνονται προς τα πάνω,ενώ στο GDI (που χρησιμοποιούν οι φόρμες σου) οι τιμές του άξονα y αυξάνουν προς τα κάτω (με τιμή y=0 στην πάνω αριστερή γωνία του control σου).Οπότε αν height είναι το ύψος του ClientSize του PictureBox σου,για κάθε σημείο που θες να σχεδιάσεις θα πρέπει να κάνεις την μετατροπή y'=height-y ώστε να σχεδιαστεί σωστά.
  •  20-06-2010, 15:57 59218 σε απάντηση της 59215

    Απ: real time γραφημα σε visual basic 2010

    God Damn im good!

    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
     
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
    
            Dim tempValue As Double
            Dim lightValue As Double
    
            tempValue = Math.Round(phidgetIFK.sensors.Item(0).Value() * 0.2222 - 61.111, 2)
            lightValue = (phidgetIFK.sensors.Item(1).Value())
    
           
            values.Add(Math.Round(250 - (tempValue + 125), 0))
            If values.Count = Me.PictureBox1.ClientSize.Width Then
                values.RemoveAt(0)
            End If
            Me.PictureBox1.Refresh()
    
            values2.Add(Math.Round(250 - (lightValue * 0.25), 0))
            If values2.Count = Me.PictureBox2.ClientSize.Width Then
                values2.RemoveAt(0)
            End If
            Me.PictureBox2.Refresh()
    
    
        End Sub
    
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    
    
            If values.Count > 1 Then
                Dim points As New List(Of Point)
                For x As Integer = 0 To values.Count - 1
                    points.Add(New Point(x, values(x)))
                Next
                e.Graphics.DrawLines(Pens.Red, points.ToArray)
                e.Graphics.DrawLine(Pens.Black, 0, 25, 320, 25)   ' -70 βαθμοι κελσιου
                e.Graphics.DrawLine(Pens.Black, 0, 125, 320, 125)  ' 0 βαθμοι κελσίου
                e.Graphics.DrawLine(Pens.Black, 0, 225, 320, 225)  ' 70 βαθμοι κελσιου
            End If
        End Sub
    
    
        Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
    
            If values2.Count > 1 Then
                Dim points As New List(Of Point)
                For y As Double = 0 To values2.Count - 1
                    points.Add(New Point(y, values2(y)))
                Next
                e.Graphics.DrawLines(Pens.Yellow, points.ToArray)
            End If
        End Sub

  •  20-06-2010, 17:40 59219 σε απάντηση της 59218

    Απ: real time γραφημα σε visual basic 2010

    bleo8onhs:
    God Damn im good!

     
            values.Add(Math.Round(250 - (tempValue + 125), 0))
            If values.Count = Me.PictureBox1.ClientSize.Width Then
                values.RemoveAt(0)
            End If
            Me.PictureBox1.Refresh()
    
            values2.Add(Math.Round(250 - (lightValue * 0.25), 0))
            If values2.Count = Me.PictureBox2.ClientSize.Width Then
                values2.RemoveAt(0)
            End If
            Me.PictureBox2.Refresh()
    
    
      


    Φαντάζομαι αυτό το 250 είναι το ύψος του ClientRectangle του control,σωστά;Δε θα ήταν καλύτερα να μην ήταν hard-coded αλλά του στυλ Me.PictureBox1.ClientSize.Height;Ειδάλλως θα αναγκαστείς να καταφύγεις σε τεχνικές για να μην μπορεί να κάνει resize το control σου (ή και τη φόρμα σου αν έχεις auto-resize) ο χρήστης,άσε που μπορεί να ξεχαστείς και ο ίδιος αν αλλάξεις το layout κάποια στιγμή.

  •  21-06-2010, 11:34 59231 σε απάντηση της 59213

    Απ: real time γραφημα σε visual basic 2010

    Πόσο "realtime" είναι το realtime που ζητάς? Γιατί το Chart Control του .NET μπορεί άνετα να δείξει αλλαγές σε επίπεδο millisecond, πόσο μάλλον κάθε δευτερόλεπτο. Αν μάλιστα χρησιμοποιήσεις κάποιο γράφημα τύπου FastPoint ή FastLine μπορείς να δείξεις ταυτόχρονα πάρα πολλά σημεία με άμεση ανανέωση. 



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-06-2010, 14:26 59234 σε απάντηση της 59231

    Απ: real time γραφημα σε visual basic 2010

    Το σκέφτηκα και γώ αυτό σχετικά με το ύψος και σχετικά με άλλα όρια που έβαλα στο γράφημα. ήδη το άλλαξα με Me.Height, και αυτό μπήκα να ποστάρω τώρα!

    το chart control θα το κοιτάξω και αν είναι καλό θα το χρησιμοποιήσω..

    Ευχαριστώ!
  •  21-06-2010, 14:33 59235 σε απάντηση της 59234

    Απ: real time γραφημα σε visual basic 2010

    Για ρίξε μία ματιά στα samples για να πάρεις μία ιδέα.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-06-2010, 18:41 59236 σε απάντηση της 59235

    Απ: real time γραφημα σε visual basic 2010

    Οριστε...


    Και γραμμένο ώστε να μην συμπυκνώνεται αλλά μετά τα 100Χ να κινείται ο άξονας Χ..

    πρέπει να αλλάξω τον τύπο του value γιατί το chart αλλάζει μόνο του τον άξονα.

        Private values As New List(Of Double)
        Private values2 As New List(Of Double)
    
    
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
    
            Dim tempValue As Double
            Dim lightValue As Double
            Dim numberOfPointsInChart As Integer = 100
            Dim numberOfPointsAfterRemoval As Integer = 100
    
            tempValue = Math.Round(phidgetIFK.sensors.Item(0).Value() * 0.2222 - 61.111, 2)
            lightValue = (phidgetIFK.sensors.Item(1).Value())
    
           
    
            values.Add(Math.Round(250 - (tempValue + (250 / 2)), 0))
           
    
            values2.Add(Math.Round(250 - (lightValue * (250 / 1000)), 0))
           
    
    
            If values.Count > 1 Then
                Dim points As New List(Of Point)
                For x As Integer = 0 To values.Count - 1
                    points.Add(New Point(x, values(x)))
                Next
                Chart1.Series("Series1").Points.AddXY(values.Count, tempValue)
    
            End If
    
            If values2.Count > 1 Then
                Dim points As New List(Of Point)
                For s As Integer = 0 To values.Count - 1
                    points.Add(New Point(s, values(s)))
                Next
                Chart2.Series("Series1").Points.AddXY(values2.Count, lightValue)
    
            End If
    
            ' Adjust Y & X axis scale
            Chart1.ResetAutoValues()
            Chart2.ResetAutoValues()
    
            While Chart1.Series(0).Points.Count > numberOfPointsInChart
                ' Remove data points on the left side
                While Chart1.Series(0).Points.Count > numberOfPointsAfterRemoval
                    Chart1.Series(0).Points.RemoveAt(0)
                End While
    
                ' Adjust X axis scale
                Chart1.ChartAreas("Default").AxisX.Minimum = values.Count - numberOfPointsAfterRemoval
                Chart1.ChartAreas("Default").AxisX.Maximum = Chart1.ChartAreas("Default").AxisX.Minimum + numberOfPointsInChart
            End While
    
            While Chart2.Series(0).Points.Count > numberOfPointsInChart
                ' Remove data points on the left side
                While Chart2.Series(0).Points.Count > numberOfPointsAfterRemoval
                    Chart2.Series(0).Points.RemoveAt(0)
                End While
    
                ' Adjust X axis scale
                Chart2.ChartAreas("Default").AxisX.Minimum = values2.Count - numberOfPointsAfterRemoval
                Chart2.ChartAreas("Default").AxisX.Maximum = Chart2.ChartAreas("Default").AxisX.Minimum + numberOfPointsInChart
            End While
    
            ' Invalidate chart
            Chart1.Invalidate()
            Chart2.Invalidate()
        End Sub

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems