PictureBox & Maus Position auf Graph

  • VB.NET

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

    PictureBox & Maus Position auf Graph

    Guten Abend zusammen, folgendes Problem liegt vor:
    Es wird in einem Programm für einen PID Regler aus einer Textdatei mit mehreren x/y Datenreihen eine Matrix erstellt, welche in einer PictureBox in Graphen dargestellt wird.
    XWert ist immer die laufende Zeit, YWerte sind z.B. Masse, Temperatur, Kühldurchfluss, usw.
    Nun ist die Frage, ob es sich irgendwie einrichten lässt, dass bei Übereinstimmung der Mausposition mit einem der Graphen, der aktuelle Position angezeigt wird oder sogar die Maus darauf "einsnappt"?

    Hier ein Ausschnitt wie die Graphen erstellt werden

    MfG

    VB.NET-Quellcode

    1. reihe5(i).X = CSng(matrix(i, 0)) * faktor_x
    2. reihe5(i).Y = PictureBox1.Height - (CSng(matrix(i, 5)) * faktor_y)
    3. If CheckBox1.Checked = True Then
    4. gfx.DrawArc(Pens.Black, reihe5(i).X - 5, reihe5(i).Y - 5, 10, 10, 0, 360)
    5. End If
    6. Next
    7. gfx.DrawLines(p1, reihe1)
    Willkommen im Forum. :thumbup:
    Was meinst Du damit?

    paubau schrieb:

    dass bei Übereinstimmung der Mausposition mit einem der Graphen, der aktuelle Position angezeigt wird ...
    Definiere
    "einsnappt"
    Im MouseMove-Event rechnest Du Dir die Mauskoordinagten in Deine Graphen-Koordinaten um und flöhst Deine Kurven an der betreffenden Koordinate durch. Verwende dabei eine sinnvolle Toleranz, z.B. +- 1 Pixel.
    Wenn Du eine Kurve gefunden hast, musst Du tun, was zu tun ist.
    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!
    Danke :)
    Also ich habe eine PictureBox erstellt, in welcher 5 Datenpunktreihen gezeichnet werden.
    Wenn ich mit der Maus auf einen der Graphen treffen sollte, soll der aktuelle Datenpunkt in der Oberfläche angezeigt werden.
    Mit "einsnappen" ist gemeint, dass wenn die Maus in der Nähe von einem der Graphen positioniert ist, diese genau auf die Linie springt.
    Über das MouseMove Event lasse ich bereits die aktuelle Position der Maus in der PictureBox anzeigen, jedoch weiß ich nicht, wie man einen permanenten Abgleich mit den Koordinaten der Datenpunktreihen realisieren kann.
    Die Funktion mit dem einsnappen ist aber auch nur optional.

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

    Auch von mir: Willkommen im Forum.
    Wenn ein Chart für Dich nicht zur Darstellung von Datenreihen infrage kommt (obwohl es dafür gemacht wurde), musst Du eben für Dein Einsnappen (ohje, die Maus soll irgendwo hinspringen - nicht gerade üblich; ggf. erst wenn man auch z.B. die Strg-Taste drückt) im MouseMove-Event einbauen und dabei den Verlauf der Graphen - tja nachberechnen und mit den Koordinaten der Maus abgleichen. Und wenn da eben zwischen Mausposition und einem Graphen nun 1 Pixel liegt, springt die Maus trotzdem auf ihre neue Soll-Position. Mehr ist nicht dahinter.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Leider nicht.. es geht um ein Projekt mit bestimmten Vorgaben, der Prof sieht da ungern Abweichungen.
    Das mit der extra Strg Taste klingt nach einer besseren Idee, danke dafür.
    Also muss die Matrix, in welcher meine Daten gespeichert sind, durchgehend in einer Schleife mit der aktuellen Mausposition verglichen werden?
    Daran hatte ich auch schon gedacht, allerdings enthalten die Datenreihen 10k+ Einträge.. aber ich versuchs mal :)
    Ja gut, Du kannst es natürlich auch anders machen: Wenn Du schon ne PicBox hast, kannst Du auch die Pixel des Bildes auswerten und den Mauscursor an die anheften. Und wenn sich dann zwei Kurven schneiden und Du zeigst auf den Schnittpunkt, musst Du eben entscheiden, an welche Kurve Du Dich dranheftest. Dann isses effektiv wursch, wieviele Daten dargestellt werden. Da kommt's dann nur noch auf die Bildgröße der PicBox an.
    Wahrscheinlich war es auch das, was RfG meinte. Bin so schlecht in Gedankenlesen :P
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    paubau schrieb:

    Also muss die Matrix, in welcher meine Daten gespeichert sind, durchgehend in einer Schleife mit der aktuellen Mausposition verglichen werden?
    Ich nehme mal an, dass die Daten da nach steigenden Koordinaten sortiert sind.
    Du musst anhand von Mouse.X den richtig tolerierten X-Bereich in Deiner Matrix identifizieren (xMin ... xMax) und dort die y-Werte anhand von Mouse.Y absuchen.
    Wenn eine Kurve auch im y-Band liegt, hast Du einen Treffer.
    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!