Hallo, in einer WinForm wird eine Linie grafisch ausgeben. Auf dieser Linie soll ein Rechteck zentriert gesetzt werden das entlang der Line sich bewegen soll. Wenn ich das Rechteck entlang der Linie fahren lasse, dann werden die zuvor gezeichneten Rechtecke nicht gelöscht und die Linie ist nicht mehr zu sehen. Gibt es in C# eine spezielle Methode, dass die zuvor gezeichneten Elemente nicht mehr dargestellt werden?
Schau dir Mal WPF und Animation an. Da brauchste dann nicht mit Canvas Draw rum hampeln. Gruß Sven
Mit dieser Methode wird zwar neu gezeichnet, allerdings ruckelt die Ausgabe so dass man sehr schwach das Rechteck sieht. this.Invalidate();
Hab mich auch lange gegen gewehrt, aber spätestens bei endlosen Eingabemasken mit MVVM hat es sich gelohnt.
Moin, Du scheinst nicht in OnPaint zu zeichnen. Du machst die Berechnung der Position in einem TimerTick und rufst dann Invalidate() auf. Zusätzlich musst die die OnPaint Methode deines Fensters (oder besser nur deines Controls, in dem du Zeichnen möchtest) überschreiben.
1 | public override void OnPaint(sender s, PaintEventArgs e){ |
2 | base.OnPaint(s,e); |
3 | ZeichneMeinRechteckHier(); |
4 | } |
PS: Code ist aus dem Gedächtnis geschrieben und wird warscheinlich so nicht richtig sein. Schau am Besten in der MSDN nach. Zusätzlich musst du das DoubleBuffering der Form aktivieren. Das kannst du bei den Eigenschaften finden.
Danke für die Infos. Die Ausgabe erfolgt bei mir in einer PictureBox. Mein Problem ist nun das Anlegen einer OnPaint Methode.
Eine override OnPaint Methode habe ich in meiner Applikation hinzugefügt. Allerdings ruckelt die Ausgabe noch stark.
Entweder musst du das Control vor dem Zeichnen einer neuen Position mit dem Hintergund überpinseln und dann Linie + Rechteck neu zeichnen oder du zeichnest vor einer neuen Position noch einmal an der alten Position mit der Hintergundfarbe Linie + Rechteck. Bsp: https://www.mycsharp.de/wbb2/thread.php?threadid=21782 merciless
Kannst du vielleicht mal den Code hier reinstellen? Dann muss man nicht raten, was du so treibst
:
Bearbeitet durch User
In dem obigen C# Code bewegt sich ein Rechteck auf einer Linie. Das funktioniert soweit. Wie kann ich nun veranlassen dass das Rechteck in einer vorgegebenen Kurve entlang fährt?
Ich sags ja nur ungern, aber mit Patch Animation wärst du schon fertig.
Patch Animation ist nicht das richtige. Das Rechteck soll der blauen Line entlang fahren. Dies müsste doch in C# realisiebar sein.
Ja, es ist realisierbar, entweder mit Mathematik, Pixel Scanning oder einfach mit WPF, siehe hier: http://www.blackwasp.co.uk/WPFPathAnimation.aspx ist das nicht genau das was du suchst? Da ist noch nicht mal Code-Behind drinn. Gruß Sven
Hab mir gleich den Beispielcode angeschaut. Konnte allerdings keine genaue Beschreibung Figures finden?
1 | <PathGeometry Figures="M0,0 L50,0 A100,100 0 0 1 150,100 A50,100 0 1 1 100,10 L400,50" /> |
Mic schrieb: > Konnte allerdings keine genaue Beschreibung Figures finden? Wie kann man die denn nicht finden? Ausgehend von der Beschreibung zu "PathGeometry" sind das genau zwei weitere Mausklicks um hier zu landen: https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/path-markup-syntax
... btw. Die Seite, von der Sourcecode stammt erklärt es ebenfalls (einfach ein paar SEiten weiteklicken): http://www.blackwasp.co.uk/WPFPathMarkupSyntax.aspx
Hab mir die Beispiel genauer angeschaut. Wenn ich allerdings dies für meine Anforderungen anpassen will dann gelingt mir dies nicht. Ich habe quasi immer Liniensegmente und ein oder zwei Kurvensegmente (90°). Das mit WPF Path Animation umzusetzen ist nun auch nicht so einfach.
Die obige Grafik(GrafischeAusgabe.PNG ) zeigt ein Liniensegment und ein Kurvensegment. Auf diesen beiden Segmenten soll ein Rechteck (Fahrzeug) zentriert entlangfahren können.
Der folgende Codeausschnitt zeigt, wie man in C# ein Rechteck darstellt und dreht. leider ist es mir bisher nicht gelungen, dass das Rechteck zentriert entlang der Kurve fährt. Für jede Hilfe würde ich mich freuen.
1 | rotate++; |
2 | y_step++; |
3 | x_step++; |
4 | |
5 | Pen penGreen = new Pen(Color.Green, 1.0f); |
6 | |
7 | Point[] _myRectangle; |
8 | |
9 | _myRectangle[0] = new Point(x_step - 25, 750 - y_pos - 25); |
10 | _myRectangle[1] = new Point(x_step + 25, 750 - y_pos - 25); |
11 | _myRectangle[2] = new Point(x_step + 25, 750 - y_pos + 25); |
12 | _myRectangle[3] = new Point(x_step - 25, 750 - y_pos + 25); |
13 | |
14 | using (Matrix matrix = new Matrix()) |
15 | {
|
16 | matrix.RotateAt(-1 * rotate, new PointF(x_step - 25, 750 - y_pos)); |
17 | matrix.TransformPoints(_myRectangle); |
18 | }
|
19 | |
20 | gPictureBox.DrawPolygon(penGreen, _myRectangle); |
Bisher ist es mir nicht gelungen, dass das Rechteck entlang der vorgegebenen blauen Linie entlang fährt. Für weitere Unterstützung bin sehr dankbar!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.