Sinuskurve mit Timer

  • VB.NET

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

    Achso, dass wusste ich noch nicht ;) Wie gesagt, Grafische und Mathematische Funktionen in VB sind für mich noch absolutes Neuland. Ich hab jetzt einfach mal 2 Werte direkt ins Form_load eingefügt. Jetzt kommt der Fehler nicht mehr und eine Linie ist in der Form. Allerdings werden die Werte, die im Timer_Event stehen nicht gezeichnet. Woran kann das liegen?
    @snow-white:
    Die Form weiß nicht, dass sie sich neuzeichnen soll. Du musst am Ende der Tick-Methode Me.Invalidate() aufrufen. Dadurch wird Windows gesagt, dass der Inhalt der Form ungültig ist und dass es die Form bei der nächsten Gelegenheit neu zeichnen soll.

    Tipp im Voraus:
    Gehe in den Form-Designer und klicke da auf die Form. Dann gibt's irgendwo einen Bereich namens "Eigenschaften" (da wo Du z.B: den Titel der Form einstellst).
    Suche dort die Eigenschaft "DoubleBuffered" und setze diese auf True. Wenn Du das nicht machst flackert alles wie verrückt.

    Edit: Zu langsam.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Vielen Dank,

    Hab´s hinbekommen, dass die Form sich aktualisiert und die Werte aus der Liste übernimmt. Muss jetz nur noch schauen, dass ich das ganze in Form einer Sinuswelle ausgegeben bekomme. Bis jetzt sieht das so aus, als könnte ich keine Kurven zeichnen. Ist das möglich? Gibt es eigentlich eine Möglichkeit, sich die Grafik "zeichnen" zu lassen? Ich meine, wenn man auf den Button klickt, dass die Form gezeichnet wird und nicht auf einmal erscheint.

    Lg Snow-White
    @snow-white:
    Es ist theoretisch möglich, eine tatsächliche Kurve zu zeichnen. Dazu müsstest Du mit Graphics.DrawEllipse() oder Graphics.DrawBezier() experimentieren. Das Problem dabei ist, aber, dass Du da nur schwierig eine Animation hinbekommst (es wird z.B. immer die komplette Ellipse gezeichnet).

    Du hast ja jetzt die Liste mit den Punkten und diese wird korrekt gezeichnet.
    Dann musst Du nur noch die richtigen Werte zur Liste hinzufügen. Die X-Koordinate ist immer das nächste Pixel (wird also immer um 1 größer).
    Und die Y-Koordinate berechnet sich so:
    Du nimmst die X-Koordinate als Parameter für den Sinus. Dabei multiplizierst Du X mit einer kleinen Zahl (z.B. 0.05), weil bei 3.14 Pixel schon eine komplette Periode vergangen wäre. Dann sieht man nicht viel.
    Der Rückgabewert der Sinus-Funktion liegt zwischen -1 und +1. Dadurch kann man ganz leicht die gewünschte Höhe auf dem Bildschirm einstellen. Wenn der Sinus 100 Pixel hoch angezeigt werden soll, dann multiplizierst Du mit 50. Dadurch kommt ein Wert zwischen -50 und +50 heraus. Das ist insgesammt 100 Pixel.
    Dann fehlt nur noch die Verschiebung.
    Bei Windows wird alles von links-oben gemessen. Das heißt, wenn der Punkt X=100, Y=200 ist, dann befindet sich der Punkt 100 Pixel rechts von der linken und 200 Pixel unter der oberen Kante der Innenseite des Fensterrahmens.
    Wenn Du den Sinus mittig in der Höhe anzeigen willst, musst Du die Hälfte der Höhe dazuzählen, damit die Mitte des Sinus genau in der Hälfte der Form liegt. Die Höhe der Innenseite des Fensterrahmens bekommst Du mit Me.ClientRectangle.Height. Dann rechntest Du einfach diese Höhe / 2 + Sinuswert.
    Wobei hier noch aufzupassen ist, denn wie gesagt: Je größer der Y-Wert, desto weiter unten ist der Punkt. Das ist umgekehrt zu dem was man erwarten würde. Deshalb ziehst Du den Sinuswert ab, anstelle ihn zu addieren: Höhe / 2 - Sinuswert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Tibha: Ja, nur dass halt nich d+sin... sondern d-sin... gerechnet wird, damit ein positiverer Wert auch weiter oben auf dem Bildschirm angezeigt wird, als ein negativerer.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils