Forum: PC-Programmierung Grafische Aufgabe mit C#


von Mic (Gast)


Lesenswert?

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?

von Mr_Sven (Gast)


Lesenswert?

Schau dir Mal WPF und Animation an. Da brauchste dann nicht mit Canvas 
Draw rum hampeln.

Gruß Sven

von Mic (Gast)


Lesenswert?

Mit dieser Methode wird zwar neu gezeichnet, allerdings ruckelt die 
Ausgabe so dass man sehr schwach das Rechteck sieht.

this.Invalidate();

von Mic (Gast)


Lesenswert?

Mit WPF möchte ich nicht nutzen

von Mr_Sven (Gast)


Lesenswert?

Hab mich auch lange gegen gewehrt, aber spätestens bei endlosen 
Eingabemasken mit MVVM hat es sich gelohnt.

von Mic (Gast)


Lesenswert?

Gibt es da keine Möglichkeit in C# (ohne WPF)????

von Keiner N. (nichtgast)


Lesenswert?

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.

von Mic (Gast)


Lesenswert?

Danke für die Infos.

Die Ausgabe erfolgt bei mir in einer PictureBox. Mein Problem ist nun 
das Anlegen einer OnPaint Methode.

von Mic (Gast)


Lesenswert?

Eine override OnPaint Methode habe ich in meiner Applikation 
hinzugefügt. Allerdings ruckelt die Ausgabe noch stark.

von Dirk K. (merciless)


Lesenswert?

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

von Keiner N. (nichtgast)


Lesenswert?

Kannst du vielleicht mal den Code hier reinstellen?

Dann muss man nicht raten, was du so treibst

: Bearbeitet durch User
von Mic (Gast)


Angehängte Dateien:

Lesenswert?

Anbei der Code.

von Mic (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Mr_Sven (Gast)


Lesenswert?

Ich sags ja nur ungern, aber mit Patch Animation wärst du schon fertig.

von Mr_Sven (Gast)


Lesenswert?

ich meinte Path Animation.

von Mic (Gast)


Lesenswert?

Ok Patch Animation kenne ich nicht. Muss mal nachschauen.

von Mic (Gast)


Lesenswert?

Patch Animation ist nicht das richtige. Das Rechteck soll der blauen 
Line entlang fahren. Dies müsste doch in C# realisiebar sein.

von Mr_Sven (Gast)


Lesenswert?

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

von Mic (Gast)


Lesenswert?

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" />

von guest (Gast)


Lesenswert?

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

von guest (Gast)


Lesenswert?

... btw.
Die Seite, von der Sourcecode stammt erklärt es ebenfalls (einfach ein 
paar SEiten weiteklicken):
http://www.blackwasp.co.uk/WPFPathMarkupSyntax.aspx

von Mic (Gast)


Lesenswert?

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.

von Mic (Gast)


Lesenswert?

Die obige Grafik(GrafischeAusgabe.PNG ) zeigt ein Liniensegment und ein 
Kurvensegment. Auf diesen beiden Segmenten soll ein Rechteck (Fahrzeug) 
zentriert entlangfahren können.

von Mic (Gast)


Lesenswert?

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);

von Mic (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.