Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Punkt drehen um einen anderen Punkt (https://www.delphipraxis.net/44592-punkt-drehen-um-einen-anderen-punkt.html)

Florian H 21. Apr 2005 11:01


Punkt drehen um einen anderen Punkt
 
Hallo,

ich habe einen PunktA und nen PunktB in nem Koordinatensystem und möchte jetzt PunktB um PunktA in nem best. Winkel rotieren lassen.

PunktA könnte z.B. auf [2|2] liegen und PunktB auf [5|3] und soll dann um 90° (natürlich nur als Bsp, sonst beliebige Winkel) gedreht werden und liegt dann auf [1|5] (wenn ich mich nu nicht verrechnet habe -.- )
Nur wie mache ich das mit Delphi?
Ich mühe mich da seit gestern ab mit allen Mitteln meines bescheidenen Mathematikwissens (Kl.11), sin,cos und tan, Steigungen usw. , aber so wirklich funktioniert nichts :/

Google war auch nicht wirklich ergiebig bei meiner Suche (wohl, weil ich nicht weiß nach was ich suchen soll?)

Achja, es geht letztendlich um das Drehen eines Dreiecks um einen seiner Eckpunkte, was sich ja auf das Drehen von 2 Punkten um einen dritten vereinfachen lässt.


Viele Grüße
Florian

Kroko1999 21. Apr 2005 11:07

Re: Punkt drehen um einen anderen Punkt
 
Code:
procedure DrehePunkt (P: TPoint; AWinkel: single; ADrehPunkt: TPoint);
var
  H: TPoint;
begin
  H.X := P.X-ADrehpunkt.X;
  H.Y := P.Y-ADrehpunkt.Y;
  H.X := H.X*Cos (AWinkel); // Winkel im Bogenmaß
  H.Y := H.Y*Sin (AWinkel);
  Result.X := H.X+ADrehpunkt.X;
  Result.Y := H.Y+ADrehpunkt.Y;
end;
Kann man noch kürzen!

Airblader 21. Apr 2005 11:10

Re: Punkt drehen um einen anderen Punkt
 
Na, wenn dann aber:

Delphi-Quellcode:
function DrehePunkt (P: TPoint; AWinkel: single; ADrehPunkt: TPoint): TPoint;
var
  H: TPoint;
begin
  H.X := P.X-ADrehpunkt.X;
  H.Y := P.Y-ADrehpunkt.Y;
  H.X := H.X*Cos (AWinkel); // Winkel im Bogenmaß 
  H.Y := H.Y*Sin (AWinkel);
  Result.X := H.X+ADrehpunkt.X;
  Result.Y := H.Y+ADrehpunkt.Y;
end;
Ne Procedure hat schließlich kein Rückgabewert

air

glkgereon 21. Apr 2005 11:10

Re: Punkt drehen um einen anderen Punkt
 
also mit cos und sin biste schon richtig.

Delphi-Quellcode:
radius:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//Pytagoras
winkel=asin(abs(x1-x2));
winkel=winkel+90;
x2:=x1+sin(winkel)*radius;
y2:=y1+cos(winkel)*radius;
falls was nicht stimmt, tausch mal sin und cos...aber das prinzip ist imho richtig...

alcaeus 21. Apr 2005 11:12

Re: Punkt drehen um einen anderen Punkt
 
Im Beispiel von gklgereon sind sin und cos immer vertauscht. Cos gibt die Ankathete (x), Sin die Gegenkathete (y). Ebenso musst du es bei asin bzw. acos umtauschen (wie er ja bereits vermutet hat ;))

Greetz
alcaeus

Florian H 21. Apr 2005 11:12

Re: Punkt drehen um einen anderen Punkt
 
Zitat:

Zitat von Kroko1999
Code:
procedure DrehePunkt (P: TPoint; AWinkel: single; ADrehPunkt: TPoint);
var
  H: TPoint;
begin
  H.X := P.X-ADrehpunkt.X;
  H.Y := P.Y-ADrehpunkt.Y;
  H.X := H.X*Cos (AWinkel); // Winkel im Bogenmaß
  H.Y := H.Y*Sin (AWinkel);
  Result.X := H.X+ADrehpunkt.X;
  Result.Y := H.Y+ADrehpunkt.Y;
end;
Kann man noch kürzen!

also wenn ichs so mache:
Delphi-Quellcode:
function DrehePunkt (P: TPoint; AWinkel: single; ADrehPunkt: TPoint) : TPoint;
var
  H: TPoint;
begin
  H.X := P.X-ADrehpunkt.X;
  H.Y := P.Y-ADrehpunkt.Y;
  H.X := round(H.X*Cos (AWinkel)); // Winkel im Bogenmaß
  H.Y := round(H.Y*Sin (AWinkel));
  Result.X := H.X+ADrehpunkt.X;
  Result.Y := H.Y+ADrehpunkt.Y;
end;
gehts auch noch nicht (hatte round() und Rückgabewert gefehlt)... das streckt oder verzerrt nur :/

Kroko1999 21. Apr 2005 11:12

Re: Punkt drehen um einen anderen Punkt
 
GELÖSCHT

ROUND ist richtig hatte ich nicht dran gedacht,

und Denkfehler:
Code:
  P.X := Round (Hx*Cos(AWinkel)-Hy*Sin(AWinkel);
  P.Y := Round (Hx*Sin(AWinkel)+Hy*Cos(AWinkel);

Florian H 21. Apr 2005 11:25

Re: Punkt drehen um einen anderen Punkt
 
Zitat:

Zitat von glkgereon
also mit cos und sin biste schon richtig.

Delphi-Quellcode:
radius:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//Pytagoras
winkel=asin(abs(x1-x2));
winkel=winkel+90;
x2:=x1+sin(winkel)*radius;
y2:=y1+cos(winkel)*radius;
falls was nicht stimmt, tausch mal sin und cos...aber das prinzip ist imho richtig...

also selbst wenn ich an allen möglichen Stellen sin oder cos tausche - funtkionieren tut es nicht :(

Florian H 21. Apr 2005 11:37

Re: Punkt drehen um einen anderen Punkt
 
Zitat:

Zitat von Kroko1999
GELÖSCHT

ROUND ist richtig hatte ich nicht dran gedacht,

und Denkfehler:
Code:
  P.X := Round (Hx*Cos(AWinkel)-Hy*Sin(AWinkel);
  P.Y := Round (Hx*Sin(AWinkel)+Hy*Cos(AWinkel);

ahh danke, so funktoniert es =)

Florian H 21. Apr 2005 13:58

Re: Punkt drehen um einen anderen Punkt
 
oww nee, ist doch noch nicht ganz das was ich wollte...

Der Punkt sollte in ner Kreisbahn um den anderen Punkt gedreht werden, mit dem Code wird die Bahn aber Elliptisch (wenn x2-x1 != y2-y1) ....

was muss ich daran verändern?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.
Seite 1 von 2  1 2      

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