Benutzer mit den meisten Antworten
Cosinus Linie zeichnen ?

Frage
-
Guten Abend,
Hab heute eine Programm gesehen welches mit Java geschrieben wurde und denn Stromkreis nachbaut usw. und dann Cosinus Linien zeichnet über die Spannung usw.
Was mich jetzt sehr interessieren würde wie kann ich so eine bewegende Cosinus Linie in einer picturebox zeichnen?
Mfg
Antworten
-
Hallo, in dem Fall musst du nur in den Button-Eventhandlern l um einen größeren Betrag ändern und das Rechteck nach so einer Änderung entsprechend größer zeichnen, damit die Linie durchgängig ist:
Timer t = new Timer(); Pen Pen = new Pen(System.Drawing.Color.Red); Pen Pen2 = new Pen(System.Drawing.Color.Blue); Pen Pen3 = new Pen(System.Drawing.Color.Green); Pen Pen4 = new Pen(System.Drawing.Color.Yellow); RectangleF[] points; private void pictureBox1_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < WIDTH - 1; ++i) //Verschieben der Punkte points[i] = new RectangleF(points[i + 1].X - 1, points[i + 1].Y, points[i + 1].Width, points[i + 1].Height); points[WIDTH - 1] = new RectangleF(WIDTH, isdown ? l - JUMP : l, 1, isjumped ? JUMP : 1); e.Graphics.DrawRectangles(Pen, points); isjumped = false; isdown = false; } const int WIDTH = 200; const int JUMP = 10; bool isjumped = false; bool isdown = false; int l = 100; int k = 0; void t_Tick(object sender, EventArgs e) { ++k; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { points = new RectangleF[WIDTH]; for (int i = 0; i < WIDTH; ++i) points[i] = new RectangleF((float)i, 100f, 1f, 1f); t.Interval = 200; t.Tick += t_Tick; t.Start(); } private void buttonUp_Click(object sender, EventArgs e) { l -= JUMP; isjumped = true; isdown = false; } private void buttonDown_Click(object sender, EventArgs e) { l += JUMP; isjumped = true; isdown = true; }
Koopakiller - http://koopakiller.ko.ohost.de/
- Als Antwort markiert XxDeadLiiNexX Donnerstag, 1. November 2012 12:19
Alle Antworten
-
Hallo, die PictureBox hat das Paint-Event. Das abbonnierst du. Dann startest du einen Timer der eine Variable hoch zählt. Dann wird Invalidate für die PictureBox aufgerufen. Anschließend wird im Paint-Event die Kurve neu gezeichnet:
Timer t = new Timer(); private void pictureBox1_Paint(object sender, PaintEventArgs e) { Pen Pen = new Pen(System.Drawing.Color.Red); for (double i = 0; i < 360 + double.Epsilon; i++) { e.Graphics.DrawRectangle(Pen, (float)i, (float)(70f * Math.Cos(Math.PI * (i+j) / 180.0) + 100f), 1f, 1f); } } int j = 0; void t_Tick(object sender, EventArgs e) { ++j; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { t.Interval = 200; t.Tick += t_Tick; t.Start(); }
Den Code für das Zeichnen der Kurve habe ich hier her. Hinweis: Das Pen-Objekt solltest du direkt in der Klasse erstellen.Koopakiller - http://koopakiller.ko.ohost.de/
-
Hallo, die PictureBox hat das Paint-Event. Das abbonnierst du. Dann startest du einen Timer der eine Variable hoch zählt. Dann wird Invalidate für die PictureBox aufgerufen. Anschließend wird im Paint-Event die Kurve neu gezeichnet:
Timer t = new Timer(); private void pictureBox1_Paint(object sender, PaintEventArgs e) { Pen Pen = new Pen(System.Drawing.Color.Red); for (double i = 0; i < 360 + double.Epsilon; i++) { e.Graphics.DrawRectangle(Pen, (float)i, (float)(70f * Math.Cos(Math.PI * (i+j) / 180.0) + 100f), 1f, 1f); } } int j = 0; void t_Tick(object sender, EventArgs e) { ++j; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { t.Interval = 200; t.Tick += t_Tick; t.Start(); }
Den Code für das Zeichnen der Kurve habe ich hier her. Hinweis: Das Pen-Objekt solltest du direkt in der Klasse erstellen.
Koopakiller - http://koopakiller.ko.ohost.de/
WOW ! Habs grad probiert bin grad voll fasziniert ! Hast du das aus dem Kopf geschrieben ?
Noch ne Frage bezüglich der Linie...
Ich programmiere derzeit ein Serverüberwachungsprogramm und als Feature hatte ich mir so einen Herz Impuls gedacht nur jetzt müsste die Linie spitz sein und wenn der Server offline geht gerade :-)
Gibts da noch ne möglich keit die spitz zu machen ?
Lg
- Bearbeitet XxDeadLiiNexX Mittwoch, 31. Oktober 2012 21:33
-
Hallo, den Code für die Cosinuskurve hätteich auch nicht innerhalb von 2 Minuten machen können, aber ansonsten ist das alles reine Logik. Wenn du eine Spitze haben willst, so musst du einen Algorithmuss finden, welcher an einer bestimmten stelle in einer Zahlenfolge eine Spitze generiert.
Der Code wäre dafür aber ungeeignet, da er nur die Funktion einer Cosinus Rechung zeichnet. Für deine Abfrage müsste man wieder einen Timer alle paar (Milli)Sekunden den Status abfragen (besser von einem Event eine Variable ändern und diese abfragen) dann entsprechend die Kurve ändern.
Timer t = new Timer(); Pen Pen = new Pen(System.Drawing.Color.Red); RectangleF[] points; private void pictureBox1_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < WIDTH - 1; ++i) //Verschieben der Punkte points[i] = new RectangleF(points[i + 1].X - 1, points[i + 1].Y, points[i + 1].Width, points[i + 1].Height); points[WIDTH - 1] = new RectangleF(WIDTH, l, 1, 1); e.Graphics.DrawRectangles(Pen, points); } const int WIDTH = 200; int l = 100; int k = 0; void t_Tick(object sender, EventArgs e) { ++k; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { points = new RectangleF[WIDTH]; for (int i = 0; i < WIDTH; ++i) points[i] = new RectangleF((float)i, 100f, 1f, 1f); t.Interval = 200; t.Tick += t_Tick; t.Start(); } private void buttonUp_Click(object sender, EventArgs e) { --l; } private void buttonDown_Click(object sender, EventArgs e) { ++l; }
In dem Beispiel ist die Variable l der Zustand des Servers. 0 heißt an, 100 heißt aus. (Liegt daran das der Koordinatenursprung beim Computer oben links liegt.)
PS: Das habe ich mir jetzt selbst ausgedacht.
Koopakiller - http://koopakiller.ko.ohost.de/
- Als Antwort markiert XxDeadLiiNexX Donnerstag, 1. November 2012 11:52
- Tag als Antwort aufgehoben XxDeadLiiNexX Donnerstag, 1. November 2012 11:52
-
Hallo, den Code für die Cosinuskurve hätteich auch nicht innerhalb von 2 Minuten machen können, aber ansonsten ist das alles reine Logik. Wenn du eine Spitze haben willst, so musst du einen Algorithmuss finden, welcher an einer bestimmten stelle in einer Zahlenfolge eine Spitze generiert.
Der Code wäre dafür aber ungeeignet, da er nur die Funktion einer Cosinus Rechung zeichnet. Für deine Abfrage müsste man wieder einen Timer alle paar (Milli)Sekunden den Status abfragen (besser von einem Event eine Variable ändern und diese abfragen) dann entsprechend die Kurve ändern.
Timer t = new Timer(); Pen Pen = new Pen(System.Drawing.Color.Red); RectangleF[] points; private void pictureBox1_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < WIDTH - 1; ++i) //Verschieben der Punkte points[i] = new RectangleF(points[i + 1].X - 1, points[i + 1].Y, points[i + 1].Width, points[i + 1].Height); points[WIDTH - 1] = new RectangleF(WIDTH, l, 1, 1); e.Graphics.DrawRectangles(Pen, points); } const int WIDTH = 200; int l = 100; int k = 0; void t_Tick(object sender, EventArgs e) { ++k; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { points = new RectangleF[WIDTH]; for (int i = 0; i < WIDTH; ++i) points[i] = new RectangleF((float)i, 100f, 1f, 1f); t.Interval = 200; t.Tick += t_Tick; t.Start(); } private void buttonUp_Click(object sender, EventArgs e) { --l; } private void buttonDown_Click(object sender, EventArgs e) { ++l; }
In dem Beispiel ist die Variable l der Zustand des Servers. 0 heißt an, 100 heißt aus. (Liegt daran das der Koordinatenursprung beim Computer oben links liegt.)
PS: Das habe ich mir jetzt selbst ausgedacht.
Koopakiller - http://koopakiller.ko.ohost.de/
Ersten :
Sehr beeindruckend das du das aus dem Kopf kannst. Ist für mich ein ansporn immer weiter zu lernen :-)
zweitens:
Ok also funktionieren tut es , jedoch wenn ich denn Timer Interval auf 200 Lasse bekomm ich schöne spitze kurven doch die Animation also der Strich läuft nicht schnell genug das es flüssig aussieht. Wenn man jetzt denn Interval auf z.B. 50 stellt läuft der Strick schön flüssig doch man bekommt keine spitzen mehr zusammen da sich die Linie zu schnell bewegt :-S
- Bearbeitet XxDeadLiiNexX Donnerstag, 1. November 2012 12:00
-
Hallo, in dem Fall musst du nur in den Button-Eventhandlern l um einen größeren Betrag ändern und das Rechteck nach so einer Änderung entsprechend größer zeichnen, damit die Linie durchgängig ist:
Timer t = new Timer(); Pen Pen = new Pen(System.Drawing.Color.Red); Pen Pen2 = new Pen(System.Drawing.Color.Blue); Pen Pen3 = new Pen(System.Drawing.Color.Green); Pen Pen4 = new Pen(System.Drawing.Color.Yellow); RectangleF[] points; private void pictureBox1_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < WIDTH - 1; ++i) //Verschieben der Punkte points[i] = new RectangleF(points[i + 1].X - 1, points[i + 1].Y, points[i + 1].Width, points[i + 1].Height); points[WIDTH - 1] = new RectangleF(WIDTH, isdown ? l - JUMP : l, 1, isjumped ? JUMP : 1); e.Graphics.DrawRectangles(Pen, points); isjumped = false; isdown = false; } const int WIDTH = 200; const int JUMP = 10; bool isjumped = false; bool isdown = false; int l = 100; int k = 0; void t_Tick(object sender, EventArgs e) { ++k; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { points = new RectangleF[WIDTH]; for (int i = 0; i < WIDTH; ++i) points[i] = new RectangleF((float)i, 100f, 1f, 1f); t.Interval = 200; t.Tick += t_Tick; t.Start(); } private void buttonUp_Click(object sender, EventArgs e) { l -= JUMP; isjumped = true; isdown = false; } private void buttonDown_Click(object sender, EventArgs e) { l += JUMP; isjumped = true; isdown = true; }
Koopakiller - http://koopakiller.ko.ohost.de/
- Als Antwort markiert XxDeadLiiNexX Donnerstag, 1. November 2012 12:19