Entwickler-Ecke

WinForms - Windows Forms kurve zeichnen


stray00 - Fr 06.03.09 16:20
Titel: Windows Forms kurve zeichnen
Hi,

ich hab einen Counter erstellt und bei jedem tick möchte ich das ein punkt gezeichnet wird und als Kurve erscheint.
Folgender Code liegt vor

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Tick event

 private void tmCounter_Tick(object sender, EventArgs e)
        {
           hier will ich das die Kurve nacheinander erstellt wird !!!
        }


    private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Point[] pt = new Point[]{new Point(0,4),
                                     new Point(50,(int)counter),
                                     new Point(100,70),
                                     new Point(150,155)};

            e.Graphics.DrawCurve(new Pen(Brushes.Black, 2), pt);

        }


Danke im Voraus!!!


Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Fr 06.03.2009 um 16:10


jaenicke - Fr 06.03.09 16:34

Hallo und :welcome:

Ja, und was ist die Frage bzw. das Problem? Ich meine, was hast du denn bisher versucht / dir überlegt dazu?


stray00 - Fr 06.03.09 16:40

Ich möchte das nach jedem Tick schritt für schritt meine kurve gezeichnet wird
Ich hab aber nur über das Paint event eine Kurve direkt zu zeichnen hingekriegt.
So möchte ich das aber nicht wie gesagt .


jaenicke - Fr 06.03.09 16:54

Du kannst z.B. gradweise die einzelnen Punkte zeichnen. In einer Variable merkst du dir den aktuellen Wert in Grad, also 0 bis 360. Bei 360 setzt du den Wert wieder auf 0 zurück.

Mit Hilfe der Kreisfunktionen kannst du die Punkte berechnen:
http://de.wikipedia.org/wiki/Trigonometrische_Funktionen


stray00 - Fr 06.03.09 17:08

Die Frage ist ,wie mache ich das in c# sharp der code im paint evet erstellt mir ein punkt oder ne linie
ich möchte diesen code nach jedem tick ausgeführt bekommen.
Ich habe eine Software die mir die Spannung misst und einen Counter der die Zeit zählt.
Und bei jeder sekunde möchte das der punkt xy aus Spannung und Zeit als Kurve oder so gezeichnet wird .


Kha - Fr 06.03.09 17:17

user profile iconstray00 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe eine Software die mir die Spannung misst und einen Counter der die Zeit zählt.
In dem Fall hast du ja nicht wie im Beispiel oben eine fixe Anzahl Punkte, sondern z.B. eine List<Point>, die am Anfang leer ist und der im Tick-Eventhandler immer jeweils ein Punkt hinzugefügt wird. In diesem rufst du dann Refresh() auf, um ein Neuzeichnen zu erzwingen. Und im Paint-Handler schickst du die Liste über ToArray() an DrawCurve.


stray00 - Fr 06.03.09 19:00

Ich kann mir kein Bild davon machen wie das im code aussehen könnte
Könntest du mir vielleicht einen Anhaltspunkt geben .
Mein Problem ich kann ja mit dem Paint event eines Steuerelements etwas zeichnen aber ich hab keine vorstellung davon wie
das innerhalb des tick events aussehen könnte .


stray00 - Fr 06.03.09 19:48

Nun das mit dem neu zeichnen kriege ich hin ,das Problem .
Für jeden wert soll ein punkt gezeichnet werden die anderen punkte sollen jedoch nicht verschwinden.
Und wenn immer ein neuer punkt "gezeichnet" wird wird sie mit dem anderen punkt verbunden so soll ein "Kurve "entstehen .
Bitte um Unterstützung !!!


Th69 - Fr 06.03.09 19:55

Kha hat dir schon die Lösung genannt!

Um eine geschwungene Kurve durch alle Punkte zu erhalten, müßtest du mal nach "Spline" suchen...


Kha - Fr 06.03.09 20:32

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Um eine geschwungene Kurve durch alle Punkte zu erhalten, müßtest du mal nach "Spline" suchen...
...was DrawCurve schon von Haus aus macht :) .

@user profile iconstray00: Hapert es an einem konkreten Punkt in meiner Erklärung? Wenn du z.B. noch nie eine List<T> benutzt hast, ist es für aufwändigere Grafik-Probleme vielleicht noch etwas zu früh.


stray00 - Sa 07.03.09 11:28

Nun ich füge dem List<Point> werte hinzu siehe code

C#-Quelltext
1:
  p.Add(new Point(20, (int)counter));                    


Das Problem ist aber mein Programm misst ja die Werte und schreibt sie gleichzeitig in die List<Point>
aber wie übergebe ich das an DrawCurve oder anderen Draw Methoden siehe code


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
   private void pictureBox1_Paint(object sender, PaintEventArgs e)
      {

             Pen pen = new Pen(Color.Blue, 10);

             e.Graphics.DrawBeziers(pen, ??? );
}




wäre nett wenn mir Jemand den Code dafür angibt

Danke im Voraus !!!


jaenicke - Sa 07.03.09 11:44

Siehe Dokumentation:
Graphics.DrawBeziers [http://msdn.microsoft.com/de-de/library/ds101091.aspx]
List<T>.ToArray [http://msdn.microsoft.com/en-us/library/x303t819.aspx]
Das ergibt:

C#-Quelltext
1:
e.Graphics.DrawBeziers(pen, p.ToArray());                    


stray00 - Sa 07.03.09 11:59

Das habe ich mir schon gedacht aber da kommt dieser eine Fehler
siehe screenshot


Moderiert von user profile iconKha: Bild angehängt


Kha - Sa 07.03.09 12:06

Merkwürdig. Die Hilfe erwähnt keine ArgumentException bei DrawBeziers :gruebel: .
Klicke mal auf "Details" und schau im Stack-Trace nach, welche Methode genau die Exception ausgelöst hat.


stray00 - Sa 07.03.09 12:12

Also viel kann ich damit auch nicht anfangen
[url=http://img14.imageshack.us/my.php?image=fehler2.png]user defined image[/URL]

Und wenn ich auf stacktrace klicke kommt das
[URL=http://img12.imageshack.us/my.php?image=fehler22.png][IMG]http://img12.imageshack.us/img1


jaenicke - Sa 07.03.09 12:48

Nicht DrawBeziers sondern DrawCurve wurde ja vorgeschlagen, das Problem ist die Anzahl der Punkte.
Zitat:
Die erste Béziersplinekurve wird zwischen dem ersten und dem vierten Punkt im Punktarray gezeichnet. Der zweite und der dritte Punkt sind Kontrollpunkte, die die Form der Kurve bestimmen. Für jede folgende Kurve sind genau drei neue Punkte erforderlich: zwei weitere Kontrollpunkte und ein Endpunkt. Der Endpunkt der vorigen Kurve wird als Anfangspunkt für die jeweils folgende Kurve verwendet.
Mit DrawCurve wäre das so, mindestens 3 Punkte sind erforderlich:

C#-Quelltext
1:
2:
            if (p.Count > 2)
                e.Graphics.DrawCurve(pen, p.ToArray<Point>());
Und ich glaube hier wäre vielleicht eher Graphics.DrawLines sinnvoll:
http://msdn.microsoft.com/de-de/library/7ewkcdb3.aspx

C#-Quelltext
1:
2:
            if (p.Count > 1)
                e.Graphics.DrawLines(pen, p.ToArray<Point>());