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
Kha: 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
stray00 hat folgendes geschrieben : |
| 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
Th69 hat folgendes geschrieben : |
| Um eine geschwungene Kurve durch alle Punkte zu erhalten, müßtest du mal nach "Spline" suchen... |
...was DrawCurve schon von Haus aus macht :) .
@
stray00: 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 !!!
stray00 - Sa 07.03.09 11:59
Das habe ich mir schon gedacht aber da kommt dieser eine Fehler
siehe screenshot
Moderiert von
Kha: 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.
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>()); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!