Laden...

Rechteck um seinen Mittelpunkt gedreht zeichnen

Erstellt von Tom1 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.212 Views
T
Tom1 Themenstarter:in
10 Beiträge seit 2012
vor 12 Jahren
Rechteck um seinen Mittelpunkt gedreht zeichnen

Hallo,

vielleicht hab ich heut keinen guten Tag, aber ich kriegs einfach nicht hin. Ich möchte ein (eigentlich drei - aber hier ins Forum ums kürzer zu machen nur ein) Rechteck um die Gradanzahl, die der Zeichenmethode übergeben wird, am Punkt Location(x,y) zeichnen. Und wie gesagt, ich kriegs einfach nicht hin...


void methode(Point Location, int RotationDegrees)
{
    buffer.Graphics.TranslateTransform( ? , ? );
    buffer.Graphics.RotateTransform(RotationDegrees);
    buffer.Graphics.FillRectangle(new SolidBrush(Color.Red),Location.X,Location.Y,20,10);
    buffer.Graphics.ResetTransform();
}

Zum Aufruf von TranslateTransform():
Zuerst hatte ich als Übergabeparameter 10 und 5, also jeweils die Hälfte vom Rechteck, damit ich die Mitte erhalte und das Rechteck sozusagen nicht um seinen (0,0)-Punkt (=Location des Rechtecks) zu drehen, sondern "um die Mitte".
Allerdings kam da ein Blödsinn raus, es wurde immer irgendwo gezeichnet.

Ich bitte um Hilfe, danke euch sehr!

LG
Tom

PS: Eigentlich sinds andere Werte, aber damits einfacher ist, hab ich hier die Werte 20 und 10 (als Breite, Höhe des Rechtecks) genommen, da man mit diesen schön rechnen kann.

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Zuerst hatte ich als Übergabeparameter 10 und 5, also jeweils die Hälfte vom Rechteck, damit ich die Mitte erhalte und das Rechteck sozusagen nicht um seinen (0,0)-Punkt (=Location des Rechtecks) zu drehen, sondern "um die Mitte".

Ein guter Ansatz. Die Mitte des Rechtecks findest Du allerdings mit Location.X + Width/2 und Location.Y + Height/2
Dann dreht das Rechteck auch um den Mittelpunkt.

Wenn jetzt aber die (gedrehte) Ecke am Punkt (Location.x;Location.Y) liegen soll, empfiehlt es sich, genau diese Koordinaten als Parameter für TranslateTransform zu verwenden, damit Du zunächst den Nullpunkt an die Stelle schiebst, an der Du zeichnen willst. Dann zeichnest Du das Rechteck an die Koordinate (0;0), die ja nach der Translation dann dem gewünschten Zielpunkt entspricht.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

T
Tom1 Themenstarter:in
10 Beiträge seit 2012
vor 12 Jahren

Danke dir, sorry, hab das oben im Beitrag falsch: hab das Location.X + ... und Location.Y + ... vergessen, das war eh mein Ansatz.

Hier mein Code:
Info: Der Abstand zwischen diesen Gitternetzlinien ist auf der Variable feldbreite, die ich im folgenden Code verwende... Und noch was: ich zeichne hier ja 3 Rechtecke, Breite jeweils feldbreite/3 und Höhe jeweils feldbreite/6.
Der Methodenkopf ist eh schon oben in meinem 1. Beitrag angegeben...


buffer.Graphics.TranslateTransform(Location.X+(feldbreite/3)/2,Location.Y+(feldbreite/6)/2);
buffer.Graphics.RotateTransform(RotateDegrees);
buffer.Graphics.FillRectangle(new SolidBrush((Status != "l" && Status != "f") ? Color.Red : Color.FromArgb(46,0,1)),Location.X,Location.Y,feldbreite/3,feldbreite/6);
buffer.Graphics.FillRectangle(new SolidBrush((Status == "f") ? Color.Yellow : Color.FromArgb(71,70,29)),Location.X+feldbreite/3,Location.Y,feldbreite/3,feldbreite/6);
buffer.Graphics.FillRectangle(new SolidBrush((Status != "l" && Status != "f") ? Color.Red : Color.FromArgb(46,0,1)),Location.X+feldbreite/3*2,Location.Y,feldbreite/3,feldbreite/6);
buffer.Graphics.ResetTransform();

Und das Ergebnis:
Das gedrehte Rechteck wird viel weiter unten gezeichnet...

LG
Tom

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

dann geh' doch so vor wie ich oben in meinem Zweiten Absatz schrieb:
Verschiebe zunächst mit TranlateTransform(Location.X, Location.Y), drehe mit RotateTransform und zeichne dann Deine Rechtecke nach (0;0), (0;feldbreite/3) und (0;2*feldbreite/3).
Die xyzTransform-Methoden verschieben/drehen/skalieren das gesamte Koordinatensystem, so dass Du damit hinkommen müsstest. Die linken oberen Ecke der beiden Rechtecke aus Deinem oberen Bild liegt dann genau aufeinander.
(wenn Du um die Mitte des grauen Kästchens drehen willst, musst Du mit TranslateTransform genu an diesen Punkt schieben und dann die Koordinaten, an die die Rechtecke gezeichnet werden, entsprechend anpassen -> das ist dann eine kleine Denksportaufgabe, die Du selbst lösen darfst).

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

U
58 Beiträge seit 2011
vor 12 Jahren

hmm, ist zwar ein anderer ansatz als deiner, aber so funktioniert es auch:



            Rectangle rect = new Rectangle(100, 50, 50, 50);
            e.Graphics.FillRectangle(new SolidBrush(Color.Red),rect);


zeichnet ein normales rechtecht.



Matrix matrix = new Matrix();
            Rectangle rect = new Rectangle(100, 50, 50, 50);
            matrix.RotateAt(45, new PointF(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2));
            e.Graphics.Transform = matrix;
            e.Graphics.FillRectangle(new SolidBrush(Color.Red),rect);


rotiert das rechteckt um 45 grad im uzs an der gleichen stelle.

T
Tom1 Themenstarter:in
10 Beiträge seit 2012
vor 12 Jahren

Danke euch! 😉

Komisch, dass mein Ansatz im Beitrag 3 nicht funktioniert hat... 🤔

LG
Tom

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

das ist leicht zu erklären, wenn Du folgendes bedenkst:

Die xyzTransform-Methoden verschieben/drehen/skalieren das gesamte Koordinatensystem

Mit den Transformationen verschiebst Du in Deinem Ansatz den Koordinatenursprung in das erste Rechteck und drehst es so, dass die X-Achse nach rechts unten und die Y-Achse nach links unten zeigt.
Dann zeichnest Du die Rechtecke, benutzt dabei aber nochmal Deine Koordinaten aus Location, Der Koordinatenursprung (also der Punkt (0;0) liegt aber schon im ersten Rechteck, also verschiebst Du durch erneute Benutzung von Location.X alles nach rechts unten (entlang der neuen X-Achse) und durch Location.Y nach links unten (entlang der neuen Y-Achse) und zwar vom neuen Ursprungspunkt im ersten Rechteck aus. Das führt dann genau zu dem Ergebnis, das Dein Bild darstellt.

HTH

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca