Sinuskurve mit Timer

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Sinuskurve mit Timer

    Hallo,

    Habe mich hier gerade im Forum angemeldet, da ich einfach nirgendwo eine Lösung für mein Problem gefunden habe.
    Ich möchte eine einfache Sinuskurve auf der Form anzeigen lassen, welche in Abhängigkeit des im Timer gesetzten Intervalls "gezeichnet" wird. Leider habe ich keinen Plan, wie ich das realisieren kann. :S

    Vielen Dank im Vorraus,

    snow-white
    Ich verstehe leider überhaupt nichts :( Ich hab jetzt die System.Math importiert. Könntest du mir erklären, wie ich weiter vorgehen muss? Im Timer hab ich Intervall auf 20 gesetzt. Es kommt nicht auf eine genaue Sinuskurve an, sie soll nur als beispielhafte Darstellung dienen.
    Hier ein Mischmasch pseudo-Code - hoffe du kommst mit klar :D

    VB.NET-Quellcode

    1. Private punkteArray as Point()
    2. Private sub paint_event ...
    3. graphics.drawLines(Stift, punkteArray)
    4. End sub
    5. Private x as Integer
    6. Private sub timer_tick ...
    7. Dim y, a, b, c, d as double
    8. Y = a * math.sin(b * (x - c)) + d
    9. Neuer Punkt --> aus x und y (Konvertieren nicht vergessen, y ist Double --> Point = integer)
    10. x += 1
    11. End sub
    Vielen Dank,

    Hab soweit alles übernommen. Nur das letzte ist mir nicht ganz verständlich. Ich meine das mit dem neuen Punkt aus x und y. Wie muss ich das Konvertieren?

    VB.NET-Quellcode

    1. Private punkteArray As Point()
    2. Private Sub lag_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    3. e.Graphics.DrawLines(New Pen(Brushes.Black), punkteArray)
    4. End Sub
    5. Private x As Integer
    6. Private Sub timer2_tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    7. Dim y, a, b, c, d As Double
    8. y = a * Math.Sin(b * (x - c)) + d
    9. x += 1
    10. End Sub

    VB.NET-Quellcode

    1. New Point(x, cint(y))


    Musst den Punkt natürlich noch ins Array packen, dazu die arraygrösse neu definieren und den Punkt reinschreiben

    Edit: Und natürlich nicht zu vergessen: Control.invalidate damit das Paint Event ausgelöst wird.

    MfG Tibha
    Tja, könntet ihr Profis mir das villeicht genauer erklären? Bin was Mathematische Funktionen und Graphen in VB angeht, ein blutiger Anfänger. So weit bin ich jetzt :

    VB.NET-Quellcode

    1. Private punkteArray As Point()
    2. Private Sub lag_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    3. e.Graphics.DrawLines(New Pen(Brushes.Black), punkteArray)
    4. End Sub
    5. Private x As Integer
    6. Private Sub timer2_tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    7. Dim y, a, b, c, d As Double
    8. y = a * Math.Sin(b * (x - c)) + d
    9. x += 1
    10. End Sub


    Danke,
    snow-white

    VB.NET-Quellcode

    1. ...
    2. ReDim punkteArray(x + 1) 'Du verlängerst das Array um eine Stelle
    3. punkteArray(x) = New Point(x, Cint(y)) 'Du fügst an der Stelle mit dem Index x den errechneten Punkt ein
    4. X +=1
    5. End Sub


    Zur Info: Die Variable a entspricht der s.g. Amplitude, ihr solltest du einen Standardwert von 1 übergeben. B entspricht der Frequenz, auch hier solltest du vorerst einen Standardwert von 1 festlegen. C ist die Phasenverschiebung, kann ruhig 0 sein. Sowie d, die Verschiebung auf der y-Achse, kann auch 0 sein.

    Wenn du nun eine normale Sinuskurve angezeigt bekommst, kannst du ja einmal die einzelnen Werte verändern, um auszuprobieren was dann passiert.


    MfG Tibha

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tibha“ ()

    Mh, soweit hab ich gar nicht gedacht. Habe bisher immer nur mit Arrays oder List(of ) beschäftigt. :)

    @ Snow-white

    Dann kannst du es eben auch so machen

    VB.NET-Quellcode

    1. Private punkteListe as List(of Point)
    2. ...
    3. punkteListe.add(New point(x, cint(y)))
    4. x += 1
    5. End Sub



    Und im Paint Event dann einfach punkteListe.toArray

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tibha“ ()

    Ich hab das ganze jetzt mit mit der Point(of List) versucht, ich bekomme aber beim Ausführen immer eine Fehlermeldung.

    VB.NET-Quellcode

    1. Imports System.Math
    2. Public Class lag
    3. Private punkteArray As Point()
    4. Private punkteliste As List(Of Point)
    5. Private Sub lag_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    6. punkteliste.ToArray() 'Hier bekomme ich beim Ausführen die Fehlermeldung "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    7. e.Graphics.DrawLines(New Pen(Brushes.Black), punkteArray)
    8. End Sub
    9. Private x As Integer
    10. Private Sub timer2_tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    11. Dim y, a, b, c, d As Double
    12. y = a * Math.Sin(b * (x - c)) + d
    13. punkteliste.Add(New Point(1, CInt(3.4)))
    14. punkteliste.Add(New Point(4, CInt(2)))
    15. x += 1
    16. End Sub
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. Timer2.Start()
    19. End Sub
    20. End Class
    Erstmal entferne bitte alle leeren Zeilen. Finde das so sehr unübersichtlich.
    Dann merke dir: Wenn du den Fehler "Ein Objektverweis..." bekommst, versuchst du immer von Nothing etwas abzufragen. Du musst natürlich:

    VB.NET-Quellcode

    1. Private punkteliste As New List(Of Point)

    schreiben. Dann gehts ;)

    Ach ja, hab mir deinen Code mal angeguckt. Wozu hast du eine Variable PunkteArray?! Hier deine Klasse mal son bisschen schön und ohne das ganze unnötige Zeugs:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class lag
    2. Private punkteliste As New List(Of Point)
    3. Private Sub lag_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    4. e.Graphics.DrawLines(New Pen(Brushes.Black), punkteliste.ToArray())
    5. End Sub
    6. Private Sub timer2_tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    7. punkteliste.Add(New Point(1, 3))
    8. punkteliste.Add(New Point(4, 2))
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Timer2.Start()
    12. End Sub
    13. End Class
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ ()

    Vielen Dank, dein Code ist wesentlich ordentlicher als meiner ;) Aber leider scheint der auch nicht zu funktionieren. Die Variable "PunkteArray" scheint wohl noch von meinen bisherigen "Versuchen" zu stammen :)

    VB.NET-Quellcode

    1. Public Class lag
    2. Private punkteliste As New List(Of Point)
    3. Private Sub lag_paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    4. e.Graphics.DrawLines(New Pen(Brushes.Black), punkteliste.ToArray()) 'Da steht beim Ausführen "Ungültiger Parameter".
    5. End Sub
    6. Private Sub timer2_tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    7. punkteliste.Add(New Point(1, 3))
    8. punkteliste.Add(New Point(4, 2))
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Timer2.Start()
    12. End Sub
    13. End Class
    Dürfen wir raten was nicht funktioniert oder sagst dus uns? :)

    EDIT: Sorry, hab das Kommentar nicht gesehen...
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VincentTB“ ()