Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Winkel zwischen 2 Vektoren auch größer als 180°? (https://www.delphipraxis.net/160030-winkel-zwischen-2-vektoren-auch-groesser-als-180%B0.html)

bigben37 23. Apr 2011 23:32


Winkel zwischen 2 Vektoren auch größer als 180°?
 
Hallo DP,
um ein Objekt mit der Maus um seinen Mittelpunkt zu bewegen brauche ich den Winkel, den zwischen dem Vektor Ursprung - Startposition der Maus und Ursprung - momentane Position der Maus liegt. Nach kurzem Googeln bin ich auf diese Seite gestoßen und die dort angegebene Formel funktioniert auch so weit.
Das einzige Problem ist, dass diese Art der Berechung nur für Winkel 0° >= alpha >= 180° gilt, da immer der kleinere von beiden Winkeln berechnet wird.

Nun suche ich aber den Winkel, der zwischen der Startposition der Maus und der momentaten Position der Maus - und zwar in dieser Reihenfolge und nicht umgekerht - liegt.
Wie kann ich also schauen, ob ich den berechneten Winkel noch von 180° subtrahieren muss oder nicht :?:

Hier ist mein aktueller Code:
Delphi-Quellcode:
procedure TFuncPlotter.OnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  p1, p2: TPoint;
  da: Double; //delta alpha;
begin
  p1.X := FStartPos.X - Origin.X;
  p1.Y := FStartPos.Y - Origin.Y;
  p2.X := X - Origin.X;
  p2.Y := Y - Origin.Y;
  da := RadToDeg(ArcCos(((p1.X * p2.X + p1.Y * p2.Y) / (Sqrt(Sqr(p1.X) + Sqr(p1.Y)) * Sqrt(Sqr(p2.X) + Sqr(p2.Y)))))); //(p1 * p2) / (|p1| * |p2|)
  Rotation := FPlotterStartAngle + da;
end;
MfG Bigben37

Aphton 24. Apr 2011 01:27

AW: Winkel zwischen 2 Vektoren auch größer als 180°?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich versteh dein Problem nicht ganz, aber willst du das hier erreichen?
(mit der Maus klicken und herumfahren)

Uwe Raabe 24. Apr 2011 07:41

AW: Winkel zwischen 2 Vektoren auch größer als 180°?
 
Zitat:

Zitat von bigben37 (Beitrag 1096694)
Nun suche ich aber den Winkel, der zwischen der Startposition der Maus und der momentaten Position der Maus - und zwar in dieser Reihenfolge und nicht umgekerht - liegt.

Delphi-Quellcode:
procedure TFuncPlotter.OnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Rotation := FPlotterStartAngle + RadToDeg(ArcTan2(Y - FStartPos.Y, X - FStartPos.X));
end;

bigben37 24. Apr 2011 10:49

AW: Winkel zwischen 2 Vektoren auch größer als 180°?
 
Hui, schon so viele Antworten so früh am morgen ;)

@Aphton: Genau das wollte ich beschreiben :D

@Uwe Raabe:
Funktionniert leider nicht richtig, es liegt wahrscheinlich daran, dass ich noch den Ursprung, also den Punkt um den ich drehe, mit einbeziehen muss.
Aber der Ansatz mit ArcTan2 hat mich auf folgende funktionierende Berechnung gebracht:
Delphi-Quellcode:
procedure TFuncPlotter.OnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  p1, p2: TPoint;
begin
  p1.X := FStartPos.X - Origin.X;
  p1.Y := FStartPos.Y - Origin.Y;
  p2.X := X - Origin.X;
  p2.Y := Y - Origin.Y;
  Rotation := FPlotterStartAngle + RadToDeg(ArcTan2(p1.Y, p1.X) - ArcTan2(p2.Y, p2.X));
end;
MfG Bigben37

Aphton 24. Apr 2011 10:58

AW: Winkel zwischen 2 Vektoren auch größer als 180°?
 
Ok, dann dürfte dich das hier eventuell weiterbringen:

Edit:
Ups... Hab
Zitat:

Aber der Ansatz mit ArcTan2 hat mich auf folgende funktionierende Berechnung gebracht
überlesen

Uwe Raabe 24. Apr 2011 11:29

AW: Winkel zwischen 2 Vektoren auch größer als 180°?
 
Zitat:

Zitat von bigben37 (Beitrag 1096710)
@Uwe Raabe:
Funktionniert leider nicht richtig, es liegt wahrscheinlich daran, dass ich noch den Ursprung, also den Punkt um den ich drehe, mit einbeziehen muss.
Aber der Ansatz mit ArcTan2 hat mich auf folgende funktionierende Berechnung gebracht:
[DELPHI]

Da hatte ich wohl etwas überlesen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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