[HILFE] Graphen Zeichnen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    [HILFE] Graphen Zeichnen

    Hallo,

    ich möchte eine feste Linie zeichnen. Ich bekomme Werte aus einem anderen Programm und kann diese über eine Schnittstelle in einen Integer-Wert umwandeln.
    Jetzt möchte ich diesen Wert in einem Graphen anzeigen lassen.

    Ich habe eine X-Achse und eine Y-Achse.
    Mit punkten zu zeichnen klappt das auch ganz gut... eigentlich..
    Das sieht dann so aus:


    Wie kann ich diese Linien jetzt verbinden, sodass eine Art Graph entsteht?


    EDIT: So sieht es schon ein bisschen mehr nach einem graphen aus...


    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.
    1. [Hilfe] im Titel ist überflüssig, ca. 90% der Leute, die nen Thread erstellen, brauchen Hilfe.
    2. wie zeichnest Du bisher die Punkte? Denn normalerweise gibt es dort, wo es ein DrawPoint gibt, auch ein DrawLine.
    3. Wo soll eine Linie gezeichnet werden? Zwischen zwei einzelnen Punkten => bei 20 Punkten ergeben sich 10 Linien; oder eine große Linie => setzt voraus, dass alle Punkte auf derselbigen liegen bzw. die Punkte Koordinaten einer linearen Gleichung sind => s. Punkt 2

    EDIT:
    4. Was stellst Du Dir unter "Graph" vor? Eine geschätzte Gerade, die die vermutete Gleichung darstellt, die die Punktedaten vermuten lassen?
    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.
    Hier bietet sich der GraphicsPath an.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. Dim coords As New List(Of Point)
    3. For x = 0 To 9
    4. For y = 0 To 9
    5. coords.Add(New Point(x * 10, y * 10))
    6. Next
    7. Next
    8. Using gp As New GraphicsPath
    9. gp.AddBeziers(coords.ToArray())
    10. e.Graphics.DrawPath(Pens.Black, gp)
    11. End Using
    12. End Sub
    And i think to myself... what a wonderfuL World!
    Hi
    insgesamt kommt es auf den Fall an. Handelt es sich um eine bekannte Funktion, bzw. ist bspw. gegeben, dass es sich um eine Polynomfunktion, eine Überlagerung von Sinusfunktionen, usw. handelt?
    Und Vorsicht: Trotz aller Glättung sind Interpolationen nicht akkurat. Bezierkurven sind idR. gleich nochmal schlechter, da sie nicht durch die Punkte gehen.
    Handelt es sich überhaupt um eine kontinuierliche Funktion?

    Viele Grüße
    ~blaze~
    Hallo, danke für die schnellen Antworten.

    Unter Graph stelle ich mir ein ein Koordinatensystem vor, welches eine X und eine Y Koordinate hat.
    Alle 100 Ticks werden diese Koordinaten geupdated mit einem Timer bisher. Die X-Koordinate geht +1 und die
    Y-Koordinate bekommt den Wert von besagter Funktion.

    Diese Werte sollen auf dem Graphen mit markiert werden und durchlaufen.
    Aber die punkte sollten verbunden werden, damit man sieht, ob eine Linie hoch oder Runter geht.

    Danke :)

    Bisher zeichne ich das so mit Rectangles, was sehr "Scheiße" aussieht und nicht genau das erfüllt, aber zumindest die punkte zeichnet:

    VB.NET-Quellcode

    1. 'Dim myBrush1 As New System.Drawing.SolidBrush(System.Drawing.Color.Blue)
    2. 'Dim formGraphics1 As System.Drawing.Graphics
    3. 'formGraphics1 = Me.CreateGraphics()
    4. 'formGraphics1.FillRectangle(myBrush1, New Rectangle(lbl_x.Text, lbl_y2.Text, 8, 8))
    5. 'myBrush1.Dispose()
    6. 'formGraphics1.Dispose()

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.
    Ersetze CreateGraphics durch das Paint-Ereignis. Verwende Using statt manuellem Dispose. Wenn in einem Using-Block ein Fehler auftritt, wird dennoch korrekt Dispose ausgeführt.
    Halte alle Punkte in einer Liste von Punkten und zeichne diese dann entsprechend. Wie das "entsprechend" aussieht, kann ich dir ohne weitere Informationen nicht sagen. Der meines Erachtens unschöne Weg ginge über Linien, die zwischen den Punkten gelegt werden, der mMn. schöne Weg wäre, es über eine Funktion zu lösen, die der Realität entspricht.
    Was genau wird dargestellt? Handelt es sich um eine reale Größe (Sensordaten, usw.)?

    Viele Grüße
    ~blaze~
    Viele Fragen blieben so unbeantwortet. Wenn es Dir nur darum geht, alle Punkte miteinander zu verbinden, sodass es quasi wie ein Aktienkurs aussieht, dann wärst Du bei formGraphics1.DrawLines() richtig. Oder alternativ den letzten gezeichneten Punkt speichern und bei Deinem Timer_Tick den letzten mit dem aktuellen Punkt mittels DrawLine verbinden.
    Wenn das nicht ist, was Du willst, poste mal bitte ein paar Bilder, wie die Punktewolke aussieht und wie die gewünschte Linie dazu aussieht, bevorzugt mit anderer Farbe, damit es keinen farblichen Einheitsbrei gibt.

    btw: New Rectangle(lbl_x.Text, lbl_y2.Text, 8, 8)) => Option Strict Off-Alarm! besser zeitnah zu Option Strict On wechseln
    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.

    ~blaze~ schrieb:

    Was genau wird dargestellt? Handelt es sich um eine reale Größe (Sensordaten, usw.)?


    Genau, es kommen Sensordaten, die aber bereits Real - zu - Integer konvertiert werden.

    Was für Infos brauchst Du noch?

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.

    NudelHolz schrieb:

    Was für Infos brauchst Du noch?


    Diese:

    ~blaze~ schrieb:

    insgesamt kommt es auf den Fall an. Handelt es sich um eine bekannte Funktion, bzw. ist bspw. gegeben, dass es sich um eine Polynomfunktion, eine Überlagerung von Sinusfunktionen, usw. handelt?
    [...]
    Handelt es sich überhaupt um eine kontinuierliche Funktion?


    Viele Grüße
    ~blaze~
    Also ich kann ja mal das komplette Projekt nennen.

    Ich möchte die Geschwindigkeit eines Förderbandes messen.
    Dazu schraube ich einen Drehgeber oder Incrementalgeber an das Laufband. Dieser Gibt mir eine Spannung von -10 - +10V aus.
    Diese Spannung kann ich mit einem Board abfangen und per Klasse in VB.NET in einen INT Wert umwandeln. Dieser Wert soll
    als Sinuskurve kontinuirlich auf einem graphen je nach Wert hoch und runter gehen.

    Dieser Graph soll so aussehen:



    Die wellen vom Graphen sind nur ausgedacht. Ich möchte von mehreren Eingängen, die ich von der Klasse auf einmal verarbeiten kann - einen Wert haben,

    diesen rechne ich erstmal von 0% - 100% - - - die größe des Graphen werde ich dann auf eine größe einstellen, damit ich die 0-100% nutzen kann.

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.
    Aha. Dann wäre das mit dem Sinus m.E. wohl nur ein Idealwert, den man später eintragen könnte als "ungefähre, postulierte Funktion", aber erstmal sind es wohl nur Punkte, die mit Linien verbunden werden sollte, entsprechend "Aktienkurs" und Hinweis aus Post#7 und Post#9.
    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.
    Du hast mehrere Möglichkeiten, das darzustellen. An sich kannst du tatsächlich eine Interpolation zwischen den Punkten vornehmen. Schreibe dazu in die Liste einfach weitere Punkte, sodass der Abstand hochstens 1 ist (dx^2 + dy^2 <= 1, wobei (dx, dy) die Koordinaten von jetzt minus dem vorherigen Schritt sind) und zeichne diese dann bspw. über DrawLines.
    Alternative: DrawCurve würde sich zwar auch anbieten, aber ich bin mir nicht sicher, ob das das Ergebnis nicht verfälscht darstellt. Wenn dir das egal ist, nimm das. Eine andere Alternative wäre, einfach nur DrawLines zu verwenden.

    Für die Interpolation, die ich vorschlagen würde, müsstest du dann ein wenig rechnen, wofür du allerdings wohl Oberstufenmathematik benötigst, d.h. zumindest Ableitung bzw. Kurvendiskussion.


    Viele Grüße
    ~blaze~