Graphen mit Drawcurve zeichen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Graphen mit Drawcurve zeichen

    Hallo zusammen,

    ich möchte einen Graphen mit Drawcurve zeichnen lassen. Soweit so gut. Ich habe auch ein PointF-Array mit x und y Werten gefüllt aber irgendwie wird nichts gezeichnet.
    Hab das PointF-Array mir auch mal in einer Listbox ausgeben lassen um zu überprüfen ob die Werte in Ordnung sind.
    Ich hoffe ihr könnt mir helfen. Danke im vorraus.

    VB.NET-Quellcode

    1. 'Festlegung wo der Graph "Graph1" abgebildet wird
    2. Dim GraphVT As System.Drawing.Graphics = PB_Graph1.CreateGraphics
    3. 'Definition des Stiftes "StiftfuerGraph1" als blauen Pen
    4. Dim Stift1 As New System.Drawing.Pen(System.Drawing.Color.Blue)
    5. 'Point-Array dimensionieren in dem alle berechneten Punkte abgespeichert werden
    6. Dim Punkte(50) As PointF
    7. If R2 = 0 Then
    8. I = 0.5 * M * (R1 ^ 2) 'Vollzylinder
    9. ElseIf R2 <> 0 Then
    10. I = 0.5 * M * (R1 ^ 2 + R2 ^ 2) 'Hohlzylinder
    11. End If
    12. a = ((g * Math.Sin(Winkel)) / (1 + (I / (M * R1 ^ 2))))
    13. ListBox2.Items.Add(Math.Round((a), 4) & " m/s²")
    14. ListBox2.Items.Add(Math.Round((I), 4) & " J")
    15. Dim H2 As Double = 0
    16. 'For H2 = 0 To H Step (H / 50)
    17. Dim i1 As Integer
    18. For i1 = 0 To 50
    19. H2 = i1 * (H / 50)
    20. v = Math.Sqrt((2 * g * H2) / (1 + (I / (M * R1 ^ 2))))
    21. E_pot = M * g * (H - H2)
    22. E_kin = 0.5 * M * (v ^ 2)
    23. w = Math.Sqrt(((2 * M * g * (H2)) / I) - ((M * (v ^ 2)) / I))
    24. E_rot = 0.5 * I * w ^ 2
    25. t = v / a
    26. Punkte(i1).X = Math.Round(t * 15)
    27. Punkte(i1).Y = Math.Round(v * 15)
    28. End With
    29. Next i1
    30. For o = 0 To 50
    31. ListBox4.Items.Add(Punkte(o))
    32. Next
    33. 'Kurve mit Drawcurve zeichnen lassen; Syntax:(Stift, Punktearray)
    34. GraphVT.DrawCurve(Stift1, Punkte)
    @p.ginczek Wenn Dir ein Chart genügt, gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Morrison nein ein Paint Event hab ich nicht.

    Also Vorlage habe ich diesen Code, welcher mir von der Fachhochschule zu Verfügung gestellt wurde.
    Eigentlich hab ich diesen nur ein wenig modifiziert.

    Visual Basic-Quellcode

    1. Private Sub Button_sin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_sin.Click
    2. 'Festlegung wo der Graph "Sinus" abgebildet wird
    3. Dim Sinus As System.Drawing.Graphics = PictureBox_Dem.CreateGraphics
    4. 'Definition des Stiftes "Stiftfuersinus" als blauen Pen
    5. Dim Stiftfuersinus As New System.Drawing.Pen(System.Drawing.Color.Blue, 5)
    6. 'Point-Array dimensionieren in dem alle berechneten Punkte abgespeichert werden
    7. Dim Punkte(100) As PointF
    8. 'Punkte berechnen
    9. For i = 0 To 100
    10. Punkte(i).X = i * 15
    11. Punkte(i).Y = Math.Sin(i) * 15 + ((PictureBox_Dem.Height) / 2)
    12. Next i
    13. 'Kurve mit Drawcurve zeichnen lassen; Syntax:(Stift, Punktearray)
    14. Sinus.DrawCurve(Stiftfuersinus, Punkte)
    15. For o = 0 To 50
    16. ListBox1.Items.Add(Punkte(o))
    17. Next
    18. End Sub


    Bild von dem PointF- Array (ein bisschen andere Code) :

    Ich glaube den Fehler gefunden zu haben, wäre schön wenn mir jemand diesen bestätigen würde und mir bei der Lösung helfen kann.
    Ich benutze gleichzeitig eine TabControl. Ich habe gerade einmal ein Test ohne TabControll gemacht und schon gings. Kann das sein das das der Fehler ist?

    Edit:

    Habs gerad nochmal probiert:
    Im ersten Tab gehts ohne Probleme auf eine PictureBox zu zeichen, aber in den anderen geht es nicht...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „p.ginczek“ ()

    p.ginczek schrieb:

    ein Paint Event hab ich nicht.
    Ich schon.
    Klick im Designer auf das entsprechende Control, dann auf den Pfeil, scrolle zu Deinem Zielevent und doppelklicke darauf.
    CreateGraphics ist in diesem Kontext ein NoGo.
    Bilder
    • Paint.png

      11,55 kB, 397×189, 132 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi!
    Probiers mal so:

    Spoiler anzeigen

    Quellcode

    1. 'Festlegung wo der Graph "Sinus" abgebildet wird
    2. 'Dim Sinus As System.Drawing.Graphics = PictureBox_Dem.CreateGraphics
    3. 'Definition des Stiftes "Stiftfuersinus" als blauen Pen
    4. Dim Stiftfuersinus As New System.Drawing.Pen(System.Drawing.Color.Blue, 5)
    5. Dim width As Integer = PictureBox_Dem.Width
    6. Dim hight As Integer = PictureBox_Dem.Height
    7. Dim bmp As New Bitmap(width, hight)
    8. Dim gr As Graphics = Graphics.FromImage(bmp)
    9. 'Point-Array dimensionieren in dem alle berechneten Punkte abgespeichert werden
    10. Dim Punkte(100) As PointF
    11. 'Punkte berechnen
    12. For i = 0 To 100
    13. Punkte(i).X = i * 15
    14. Punkte(i).Y = CSng(Math.Sin(i) * 15 + ((PictureBox_Dem.Height) / 2))
    15. Next i
    16. 'Kurve mit Drawcurve zeichnen lassen; Syntax:(Stift, Punktearray)
    17. gr.DrawCurve(Stiftfuersinus, Punkte)
    18. PictureBox_Dem.Image = bmp
    19. For o = 0 To 50
    20. 'ListBox1.Items.Add(Punkte(o))
    21. Next

    Damit erstellst Du zuerst eine Bitmap auf der gezeichnet wird und weist dann das Bild der PictureBox zu! ;)

    P.S.: Und "Option Strict On", bitte!

    Hab meinen Code in eine extra Sub gelegt und dann das Button-Click-Event darauf verwiesen..


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

    Morrison schrieb:

    VB.NET-Quellcode

    1. Dim Sinus As System.Drawing.Graphics = PictureBox_Dem.CreateGraphics
    CreateGraphics ist in diesem Kontext ein NoGo :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    p.ginczek schrieb:

    ein bisschen erklären
    Male das Bild mit CreateGraphics() ohne Paint, ohne Zuweisung einer Image-Property.
    Klicke auf ein anderes Programm, so dass Dein CreateGraphics-Programm davon bedeckt ist.
    Klicke nun wieder auf Dein CreateGraphics-Programm.
    Wo ist nun das, was Du mit CreateGraphics() dargestellt hast?
    Richtig. Verschwunden.
    Damit das nicht passiert, arbeite im Paint-Event. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!