![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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 by Thomas Breitkreuz