zwei Arrays gegeneinander plotten

  • VB.NET

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

    zwei Arrays gegeneinander plotten

    Hallo, bin neu hier :rolleyes:

    brauch etwas Unterstützung beim Visualisieren meiner Ergebnisse: Nach jedem Berechnungsschritt liegen zwei Werte vor: x(i) und y(i) Diese Werte sollen als "Daumenkino" in der x-y Ebene (Form1) geplottet werden: x(1), y(1) und x(2), y(2) und x(3), y(3) usw. (mit Punkten bzw. Kreuze, kleinen Kreise etc.) Wie macht man das? Vielleicht hat jemand einen hilfreichen LINK? Wie legt man eigentlich den Koordinatenursprung fest?

    In meinem Anfängerbuch stehts nicht und mit google komm ich leider nicht weiter. Wäre sehr dankbar für etwas Anschub!

    mfg

    arnie schrieb:

    "Daumenkino"
    Das bedeutet eine Bewegung - der Punkt soll seine Location ändern.

    Ich empfehle Ownerdrawing, weil das ist das schnellste und ist enorm erweiterungsfähig. Auf Control mit beweglicher Figur die Figur kann nicht nur ihre Location ändern, sondern auch ihre Ausrichtung.
    Willkommen im Forum. :thumbup:
    Vielleicht fangen wir damit an, Deine x- und y-Werte einfach nur darzustellen,
    Du benötigst eine Form mit einem Button:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private x() As Integer = {1, 2, 3, 4, 5} ' Deine Werte
    3. Private y() As Integer = {9, 3, 7, 5, 1}
    4. Private polygon As New List(Of Point) ' ein darstellbares Objekt
    5. Private flag As Integer = 0 ' Kennung, was gemalt werden soll
    6. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    7. For i As Integer = 0 To Math.Min(x.Length, y.Length) - 1
    8. polygon.Add(New Point(x(i) * 20, y(i) * 20)) ' Deine Punkte setzen und skalieren
    9. Next
    10. flag = 1 ' Kennung setzen
    11. Me.Invalidate() ' Zeichnen anstoßen
    12. Me.Update()
    13. End Sub
    14. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    15. ' hier wird gezeichnet
    16. Select Case flag ' Kennung auswerten
    17. Case 0
    18. ' initial nichts tun
    19. Case 1
    20. e.Graphics.DrawPolygon(Pens.Black, polygon.ToArray)
    21. Case Else
    22. ' später noch was anderes tun
    23. End Select
    24. End Sub
    25. End Class
    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!
    zu 1.
    In einer PictureBox, Bitmap und Co ist links oben = (0, 0). Addiere einfach auf alle Punkte Deine Zielkoordinaten drauf oder (das kriegen wir später).
    zu 2.
    Timer1.Interval = DELTA
    zu 3.
    - Kreuz: => entsprechendes Polygon oder 2 Linien
    - Punkt: Linie mit Endpunkt = Startpunkt
    - Kreis: DrawEllipse()
    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!

    RodFromGermany schrieb:

    Gut erholt? :D
    Wie ist Dein aktueller Stand?
    Hallo,

    danke für Deine Antwort! Ich war leider nicht auf Weltreise ;) Hab mir im Sommersemester einfach zu viel vorgenommen. Glücklicherweise darf ich die Hausaufgaben (alle in VB) in diesem Kurs noch nachtragen. Zum Stand: Die beiden ersten Referenzwerte (x_1,y_1) stimmen soweit. Jetzt müssen die (x,y) Datenpaare mit der dazugehörigen UTC in eine .txt geschrieben werden (3 Spalten) und soll natürlich auch geplottet werden. Ein Daumenkino wäre toll. Geht am späteren Nachmittag endlich weiter. Ich muss mich erst einmal wieder einarbeiten....

    mfg
    Sieh Dir mal als Anhaltspunkt dies hier an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    2. Dim x() As Integer = {0, 1, 2, 3, 4, 5}
    3. Dim y() As Integer = {0, 1, 4, 9, 16, 25}
    4. Dim pts As New List(Of Point)
    5. Dim xx As Integer = 50
    6. Dim yy As Integer = 10
    7. For i As Integer = 0 To Math.Min(x.Length, y.Length) - 1
    8. pts.Add(New Point(xx * x(i), yy * y(i)))
    9. Next
    10. Dim g As Graphics = e.Graphics
    11. g.DrawPolygon(Pens.Black, pts.ToArray)
    12. End Sub
    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!

    RodFromGermany schrieb:

    Sieh Dir mal als Anhaltspunkt dies hier an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    2. Dim x() As Integer = {0, 1, 2, 3, 4, 5}
    3. Dim y() As Integer = {0, 1, 4, 9, 16, 25}
    4. Dim pts As New List(Of Point)
    5. Dim xx As Integer = 50
    6. Dim yy As Integer = 10
    7. For i As Integer = 0 To Math.Min(x.Length, y.Length) - 1
    8. pts.Add(New Point(xx * x(i), yy * y(i)))
    9. Next
    10. Dim g As Graphics = e.Graphics
    11. g.DrawPolygon(Pens.Black, pts.ToArray)
    12. End Sub
    Hallo! Danke für den Code. Leider stimmen meine Datenpaare nocht nich 100%. Hab heute etwas gebraucht, um in die Problemstellung und die dahinterstehende Theorie wieder einzusteigen. Ist halt schlecht plotten, wenn die Daten nicht stimmen. Da kann ich dann die Aufgabe gleich mit Gimp lösen :) Laß uns bitte erst hier

    [VB 2010] Arrays in Datei schreiben

    weitermachen ;) Die Ausgabe muss dann noch formatiert werden (6 Nachkommastellen). Da werd ich noch etwas googeln und im Buch lesen. Meld mich dann morgen im Beitrag "arrays-in-datei-schreiben"....

    mfg
    Hallo! Bin wieder am Start. Sorry, hatte viel um die Ohren. Ok, muss mich erst einmal wieder einarbeiten. Einstiegsfrage: Was für ein Objekt muss ich auswählen, damit ich das Codegerüst vom Codebeispiel von Rod bekomme?

    Quellcode

    1. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    2. End Sub


    Bei einer Picturebox steht "Private Sub PictureBox1_Click..."

    mfg
    Hi
    die meisten Controls haben ein "sichtbares" Paint-Event. Einen Paint-Ereignishandler erzeugst du am schnellsten, indem du innerhalb des Click-Handlers im Kombinationsfeld oben rechts über dem Textfenster das Paint-Event auswählst. Das geht auch, wenn du im Codefenster direkt im linken Kombinationsfeld erst das Control, anschließend das zugehörige Ereignis auswählst.

    Zum Plotten: Arrays sind relativ ungenau, da du sie durchgehend interpolieren musst. Wenn dich das stört und es dir nicht zu weit fortgeschritten ist, könntest du einen Delegaten zum Plotten verwenden.
    Hier hatte ich z.B. einen solchen Code gepostet:
    vb-paradise.de/allgemeines/sou…es-plotten-von-funktionen
    Allerdings sind auch die Beschränkungen zu beachten (die man größtenteils durch simple Anpassungen entfernen kann).

    Gruß
    ~blaze~

    arnie schrieb:

    Was für ein Objekt muss ich auswählen, damit ich das Codegerüst vom Codebeispiel von Rod bekomme?


    Das ist bereits ausreichend:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    2. End Sub
    Die Handles-Klausel hinten bezeichnet bereits das richtige Event des richtigen Controls.
    In diese Methode gehört dein Zeichnungs-Code.


    (Allerdings kotzt es mich an, dass offensichtlich mal wieder Aufgaben gegeben werden, mit nichtmal einem Hinweis, woher das notwendige Grundlagenwissen zur Lösung überhaupt hernehmen (bewahre denn, dieses Wissen selbst zu vermitteln))
    Also .Net programmieren lernen kannst du, wennde dieses Buch Lesen tust (die 2005er-Version) (und nicht iein anneres Buch).

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Du musst in Deinem Programm die Daten bereitstellen, die dann in der Paint-Routine dargestellt werden; die Paint-Routine stellt die GUI "aus dem Gedächtnis dar".
    Wenn neue Daten da sind, musst Du die entsprechende Region für ungültig erklären: Invalidate(...) (beachte die Überladungen) und mit Update() wird neu gezeichnet, sprich das Paint-Event generiert.
    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!
    Hallo und danke für eure schnellen Antworten. Ok, dass Minibsp von Rod läuft soweit. Die berechneten (x,y) Werte sollen allerdings NICHT interpoliert werden! Die Werte sollen einfach nur als Punkte (kleine Kreuze oder Kreise) auf den Bildschirm gebracht werden. Wie kann man das realisieren? Und: Wie kann man den Koordinatenursprung als kleines Kreuz darstellen? Messergebnisse visualisieren und Datenpaare plotten ist doch eigentlich ein Klassiker in den Naturwissenschaften und der Mathematik. Wieso verdammt nochmal kann ich weder in Büchern noch über google was brauchbares finden...?

    mfg
    Den Koordinatenursprung kannst du einfach durch eine Verschiebung von X und Y realisieren. Das funktioniert ja nicht anders, als bei Funktionen in der Mathematik f(x) = y mit der Verschiebung des Koordinatenursprungs um (x0, y0) f*(x) = f(x-x0) + y0 oder so, Vorzeichen jenachdem wie du es gern hättest.
    Schau dir zum Kreuzchen zeichnen mal e.Graphics.DrawLine an. Einfach zwei Linien im 90°-Winkel übereinander zeichnen.

    Gruß
    ~blaze~

    arnie schrieb:

    Messergebnisse visualisieren und Datenpaare plotten ist doch eigentlich ein Klassiker in den Naturwissenschaften und der Mathematik. Wieso verdammt nochmal kann ich weder in Büchern noch über google was brauchbares finden...?
    Weils unendlich viele Möglichkeiten gibt, Datenpaare darzustellen.
    Da gibts keine Patentlösung, die alles abdeckt.

    guck - hier im Thread ist deine Anforderung auch mißverstanden worden - man dachte, du wollest ein Linien-Chart zeichnen, aber es geht dir um ein Daumenkino (da kann man nun nicht sagen, dass das ein Klassiker der Daten-Visualisierung ist).

    Womit wir wieder bei post#2 wären
    Ok, hab eine Idee, wie man die (x,y) Datenpaare plotten könnte: In einer Schleife werden die Datenpaare jeweils mit einem

    VB.NET-Quellcode

    1. DrawEllipse(Pens.Black, x(i), y(i), 5, 5)

    dargestellt. Dabei ist x(i) und y(i) der Ursprung meiner Ellipse (in diesem Fall ein Kreis). Jetzt hab ich nur das Problem, dass die Standardmaßeinheit Pixel sind und die x(i) und y(i) ganze Zahlen sein müssen. Kann man die Werte zum Visualisieren einfach runden..!?

    VB.NET-Quellcode

    1. DrawEllipse(Pens.Black, CInt(x(i)), CInt(y(i)), 2, 2)

    Oder kann mann eine andere Maßeinheiten verwenden? Hab da was über PageUnit gelesen...

    Und dann hab ich noch ein grundlegendes Problem: Ich hab einen Button und eine Picturebox. Wenn man auf den Button klickt, soll ein Datenpaar (eine Ellipse) in die Picturebox gezeichnen werden. Wo muss was hin..!?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    3. Dim g As Graphics = e.Graphics
    4. g.DrawEllipse(Pens.Black, 100, 50, 100, 50)
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. End Sub
    8. End Class


    mfg

    arnie schrieb:

    Kann man die Werte zum Visualisieren einfach runden..!?

    na klar.


    arnie schrieb:

    Und dann hab ich noch ein grundlegendes Problem: Ich hab einen Button und eine Picturebox. Wenn man auf den Button klickt, soll ein Datenpaar (eine Ellipse) in die Picturebox gezeichnen werden. Wo muss was hin..!?
    Du doch bereits alle notwendigen Elemente beisammen

    VB.NET-Quellcode

    1. Public Class Form1
    2. private i As Integer
    3. Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    4. e.Graphics.DrawEllipse(Pens.Black, CInt(x(i)), CInt(y(i)), 2, 2)
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. i+=1
    8. PictureBox1.Invalidate 'neuzeichnen anfordern
    9. End Sub
    10. End Class