Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rechteck drehen? (https://www.delphipraxis.net/66872-rechteck-drehen.html)

Flare 5. Apr 2006 19:23


Rechteck drehen?
 
Hey ho!

Ich habe hier desen Quelltext:
Delphi-Quellcode:
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;
und möchte damit ein Rechteck gedreht darstellen lassen. Nur irgendwie macht der das nicht ganz so wie ich möchte.
Ü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

netscanner 5. Apr 2006 20:01

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:

marabu 5. Apr 2006 20:03

Re: Rechteck drehen?
 
Hallo Willy,

vielleicht kannst du dir hier ein paar Anregungen holen: klick.

Grüße vom marabu

Flare 5. Apr 2006 20:22

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?

marabu 5. Apr 2006 21:15

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

Flare 5. Apr 2006 21:30

Re: Rechteck drehen?
 
Ich habe es jetzt soweit umgebaut, dass es in mein Projekt reinpasst, er möchte aber das TXForms nicht annehmen...
Zitat:

[Error] Roboter.pas(21): Undeclared identifier: 'TXForm'
Und er erkennt auch die Konstanten nicht, wobei ich aber glaube dass es an dieser TXForm liegt.
Was muss ich einbinden oder sonstewas machen damit das geht?


Flare

marabu 6. Apr 2006 05:54

Re: Rechteck drehen?
 
Guten Morgen.

Vielleicht hilft es, wenn du die Unit Windows einbindest?

marabu

Flare 6. Apr 2006 06:31

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

marabu 6. Apr 2006 06:49

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

Flare 6. Apr 2006 16:21

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:
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;
Für diese Überlegung habe ich heute ganze 2 Reli-Stunden gesessen :lol:


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.

Hawkeye219 6. Apr 2006 18:33

Re: Rechteck drehen?
 
Hallo Flare,

hier ist eine Routine, die Dir bei Deinem Problem helfen könnte:

Delphi-Quellcode:
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;
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.

Hier ein Beispielaufruf:
Delphi-Quellcode:
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;
Gruß Hawkeye

Flare 6. Apr 2006 18:50

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 05:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz