![]() |
Rechteck drehen?
Hey ho!
Ich habe hier desen Quelltext:
Delphi-Quellcode:
und möchte damit ein Rechteck gedreht darstellen lassen. Nur irgendwie macht der das nicht ganz so wie ich möchte.
procedure drawrect(p1,p2,p3,p4: TPoint);
begin Form.Canvas.MoveTo(p1.X, p1.Y); Form.Canvas.LineTo(p2.X, p2.Y); Form.Canvas.LineTo(p3.X, p3.Y); Form.Canvas.LineTo(p4.X, p4.Y); Form.Canvas.LineTo(p1.X, p1.Y); end; procedure draw(); var p1,p2,p3,p4: TPoint; begin p1.X := round(position.X + 10*cos(2*Pi/360*-(winkel+45))); p1.Y := round(position.Y + 20*sin(2*Pi/360*-(winkel+45))); p2.X := round(position.X + 10*cos(2*Pi/360*-(winkel+90+45))); p2.Y := round(position.Y + 20*sin(2*Pi/360*-(winkel+90+45))); p3.X := round(position.X + 10*cos(2*Pi/360*-(winkel+180+45))); p3.Y := round(position.Y + 20*sin(2*Pi/360*-(winkel+180+45))); p4.X := round(position.X + 10*cos(2*Pi/360*-(winkel+270+45))); p4.Y := round(position.Y + 20*sin(2*Pi/360*-(winkel+270+45))); drawrect(p1,p2,p3,p4); end; Über Canvas.Rectangle geht es nicht, da die Seiten ja schräg sein sollen, was dort ja nicht geht. Kennt jemand eine Lösung für diese (scheinbar einfache aber für mich doch schwere) Drehung? Flare |
Re: Rechteck drehen?
welche drehung meinst du denn?
also dass es so liegt: <> ??? das kann man über polyline machen... schau dazu einfach mal in der delphi hilfe nach :zwinker: |
Re: Rechteck drehen?
|
Re: Rechteck drehen?
Also ich habe mir mal den Programmiertext mit dem Flugzeug angeschaut, verwenden möchte ich ihn nicht, weil ich dazu zu viel umändern müsste aber ich schau mal wie ich die einzelnen Funktionen verwenden kann.
Danke erstmal! Flare //Edit: Ich kriege es nicht hin, probiere aber erst morgen weiter. Ich suche immer noch nach einem Code der mir ein rechteck mit bekannten Ausgangskoordinaten in einem bestimmen Winkel dreht, hat noch jemand Vorschläge für mich? |
Re: Rechteck drehen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Willy,
hier ein wenig Code, der meine Hinweise aus dem verlinkten Beitrag umsetzt. Der Code ist für ein Dreieck, aber die Anpassung an ein Viereck sollte dich nicht vor unüberwindliche Schwierigkeiten stellen. marabu |
Re: Rechteck drehen?
Ich habe es jetzt soweit umgebaut, dass es in mein Projekt reinpasst, er möchte aber das TXForms nicht annehmen...
Zitat:
Was muss ich einbinden oder sonstewas machen damit das geht? Flare |
Re: Rechteck drehen?
Guten Morgen.
Vielleicht hilft es, wenn du die Unit Windows einbindest? marabu |
Re: Rechteck drehen?
Stimmt, hilft ^^
Irgendwie hat da meine Delphi-HIlfe gehangen, weil überprüft habe ich es ja... Das sieht ja jetzt an sich schon schön aus, nur dreht der Sich um einen imaginären Punkt, der irgendwo liegt, der aber eigentlich auf dem Bild in der Mitte liegen soll. Ich konnte aber nicht erkennen, wo der Mittelpunkt der Drehung eingestellt wird. Kann es sein, dass ich es danach noch über xf verschieben muss? Flare |
Re: Rechteck drehen?
Matrix-Operationen werden einfach hintereinander geschaltet (siehe Online-Hilfe). In deinem Fall wird zuerst eine Translation des Angelpunktes in den Ursprung des Koordinatensystems durchgeführt, anschließend wird das Rechteck rotiert und dann wird die Translation wieder rückgängig gemacht. Das ganze geschieht eigentlich mit einer einzigen Matrix, die entsprechend vorbereitet wird.
marabu |
Re: Rechteck drehen?
Nochmals vielen Dank an alle, ich habe jetzt versucht meine Version durchzubringen, ich wollte es unbedingt mit Trigonometrie hinbekommen.
Hier nochmal mein Code:
Delphi-Quellcode:
Für diese Überlegung habe ich heute ganze 2 Reli-Stunden gesessen :lol:
procedure TRoboter.draw();
var points: array[0..4] of TPoint; deg: array[0..4] of Single; h,b: single; i: integer; begin h := 20; b := 10; deg[0] := 180 - winkel + arctan(h/b)/Pi*180; deg[1] := 180 - winkel + 180 - arctan(h/b)/Pi*180; deg[2] := 180 - winkel - 180 + arctan(h/b)/Pi*180; deg[3] := 180 - winkel - arctan(h/b)/Pi*180; deg[4] := deg[0]; for i:=0 to 4 do begin points[i] := Point(round(position.X+b*cos(deg[i]*2*Pi/360)),round(position.Y+h*sin(deg[i]*2*Pi/360))); end; FForm.Canvas.Polyline(points); inherited; end; Flare //Edit: Mir fällt gerade auf, dass das nur hinhaut wenn Höhe und Breite des Rechtecks gleich sind (Quadrat), da scheint also was mit dem Faktor nicht zu stimmen. |
Re: Rechteck drehen?
Hallo Flare,
hier ist eine Routine, die Dir bei Deinem Problem helfen könnte:
Delphi-Quellcode:
Wie marabu je bereits geschrieben hat, muß der Drehpunkt vor der Drehung in den Ursprung geschoben werden. Bei der Funktion RotateRect wird dies innerhalb der FOR-Schleife durchgeführt. Der Rest sollte für Dich halbwegs nachvollziehbar sein und - falls ich nicht allzu viele Fehler eingebaut habe - auch funktionieren.
type
// Koordinaten einer Box TBox = array [0..3] of TPoint; // Dreht die Box aBox im Uhrzeigersinn um aAngle Grad um den Punkt aPoint function RotateRect (const aBox: TBox; const aPoint: TPoint; aAngle: Real): TBox; var i : Integer; s, c : Real; P : TPoint; // Hilfsroutine zum Drehen eines Punktes function RotatePoint (const aPoint: TPoint): TPoint; begin Result.X := Round(aPoint.X * c - aPoint.Y * s); Result.Y := Round(aPoint.X * s + aPoint.Y * c); end; begin // Sinus und Cosinus des Drehwinkels berechnen s := Sin(aAngle * Pi / 180); c := Cos(aAngle * Pi / 180); // Alle 4 Punkte der Box drehen for i := 0 to 3 do begin // Der Drehpunkt muß für die Drehung im Ursprung liegen P.X := aBox[i].X - aPoint.X; P.Y := aBox[i].Y - aPoint.Y; // Einen Punkt drehen P := RotatePoint(P); // Verschiebung rückgängig machen Result[i].X := P.X + aPoint.X; Result[i].Y := P.Y + aPoint.Y; end; end; Hier ein Beispielaufruf:
Delphi-Quellcode:
Gruß Hawkeye
procedure Beispiel;
var Box : TBox; Origin : TPoint; begin // Box definieren Box[0] := Point(40, 30); Box[1] := Point(340, 30); Box[2] := Point(340, 230); Box[3] := Point(40, 230); // Drehpunkt definieren (hier Mittelpunkt der Box) Origin.X := (Box[0].X + Box[2].X) div 2; Origin.Y := (Box[0].Y + Box[2].Y) div 2; // Drehung der Box um 45 Grad Box := RotateRect(Box, Origin, 45.0); end; |
Re: Rechteck drehen?
Hey ho!
Danke, danke, danke!!! :thumb: Genau das suchte ich, klappt perfekt! :dp: Flare |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz