Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einen Winkel errechnen!? (https://www.delphipraxis.net/41071-einen-winkel-errechnen.html)

ISAS 25. Feb 2005 13:56


Einen Winkel errechnen!?
 
Habe hier ein rechtwinkeliges Dreieck, bei dem ich die Gegenkathete und die Ankathete gegeben habe. Das wäre nun Cosinus. Jetzt lautet die Formel: cos(Alpha)=Geg/Ank Alles leicht und gut, aber wie kann ich nun Alpha in Delphi errechnen.


Habe das gefunden: function RadToGrad(Radians: Extended): Extended; Do gibt es bei mir kein RadToGrad. Zwar steht es in der Hilfe drinnen, aber es is nicht da. Cosh hab ich auch gefunden, gibs aber auch nicht. Hoffentlich kann mir einer helfen.

Danke!

Binärbaum 25. Feb 2005 14:06

Re: Einen Winkel errechnen!?
 
Das die Funktionen nicht gefunden werden, liegt wahrscheinlich daran, dass du die Unit Math nicht in der uses-Klausel hast.
Um an alpha ranzukommen, müsste es sowas wie arccos geben.

MfG
Binärbaum

Nikolas 25. Feb 2005 14:07

Re: Einen Winkel errechnen!?
 
einfach mal in der Unit Math nach sin/cos schauen. Ich glaube du brauchst eher die Funktion DegToRad oder RadToDeg, um die Winkel ineinander umzurechnen.

Binärbaum 25. Feb 2005 14:10

Re: Einen Winkel errechnen!?
 
Nur mal so nebenbei: :wink:
Gilt nicht cos(x) = Ankathete/Hypotenuse ?
Bei dir steht es aber mit Gegenkathete/ Ankathete, was meiner Meinung nach der Tangens ist.

MfG
Binärbaum

Oxmyx 25. Feb 2005 14:11

Re: Einen Winkel errechnen!?
 
Es genügen ein paar Mathekenntnisse, denn der Umrechenfaktor von Bogenmaß nach Grad (im Englischen übrigens "Degree", und nicht "Grad"!) ist pi/180.

Binärbaum 25. Feb 2005 14:15

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von Oxmyx
Es genügen ein paar Mathekenntnisse, denn der Umrechenfaktor von Bogenmaß nach Grad (im Englischen übrigens "Degree", und nicht "Grad"!) ist pi/180.

Dem kann ich nur zustimmen. RadToGrad rechnet den Winkel im Neugradmaß aus, welches manchmal bei Vermessungstechnikern verwendet wird. Dort heißt die Einheit Gon und 400 Gon bilden einen Vollwinkel, während es im "normalen" Gradmaß nur 360 Grad sind.

MfG
Binärbaum

PierreB 25. Feb 2005 14:15

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von Binärbaum
Nur mal so nebenbei: :wink:
Gilt nicht cos(x) = Ankathete/Hypotenuse ?
Bei dir steht es aber mit Gegenkathete/ Ankathete, was meiner Meinung nach der Tangens ist.

MfG
Binärbaum

Sin(Alpha)=Gegenkathete / Hypotenuse
Cos(Alpha)=Ankathete / Hypotenuse
Tan(Alpha)=Gegenkathete / Ankathete

Du hast Recht Binärbaum. ;)

sniper_w 25. Feb 2005 14:19

Re: Einen Winkel errechnen!?
 
Zitat:

A = 50 degerees

X = cos ( A * pi / 180 );
Du hast X? Willst A?

Zitat:

A = arccos(X) * 180 / pi;

Binärbaum 25. Feb 2005 14:23

Re: Einen Winkel errechnen!?
 
Also dann kann man das folgendermaßen umsetzen:

Delphi-Quellcode:
uses math;
...
var alpha, geg, ank, hyp: Real;
...
//hier Werte für Gegen-, Ankathete und Hypotenuse einlesen
..
//Alpha berechen:
alpha:= arcsin(geg/hyp);
//oder
alpha:= arccos(ank/hyp);
//oder
alpha:= arctan(geg/ank);
alpha:= RadToDeg(alpha);//ins Gradmaß umrechnen
Ist doch garnicht so schwer, wenn man die mathematischen Grundlagen (und die Delphi-Funktionen) kennt. :)

MfG
Binärbaum

ISAS 25. Feb 2005 14:24

Re: Einen Winkel errechnen!?
 
Puh, danke für die schnellen Antworten. :shock:

Es stimmt, is natürlich Tan, hab mich verschaut. Und die Formel geht nun. :P

ISAS 25. Feb 2005 15:24

Re: Einen Winkel errechnen!?
 
Zitat:

A = arccos(X) * 180 / pi;
Gibt es bei Arctan(x) einen Unterschied oder folgt darauf auch *180 / pi??

Komme irgendwie nicht so richtig hin, da ich will, dass ein Sprite immer dahin schaut, wo die Maus ist.

sniper_w 25. Feb 2005 15:28

Re: Einen Winkel errechnen!?
 
Zitat:

A = arccos(X) * 180 / pi;
A = arcsin(X) * 180 / pi;
A = arctan(X) * 180 / pi;

ISAS 25. Feb 2005 15:37

Re: Einen Winkel errechnen!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es funktioniert trozdem nicht.
Ich geb mal die EXE-File dazu. Dann sieht man den Fehler besser.
Der Code für das lautet nämlich so:

Delphi-Quellcode:
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Aim.Y-Player.Y ergibt die Gegenkathete
Aim.X-Player.X ergibt die Ankathete

sniper_w 25. Feb 2005 16:04

Re: Einen Winkel errechnen!?
 
Delphi-Quellcode:
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Warum nicht so:
Delphi-Quellcode:
Angle:=Round((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Am sonsten, wenn du uns Code posten würdest, könnten wir hilfreicher sein.

ISAS 25. Feb 2005 16:10

Re: Einen Winkel errechnen!?
 
Naja, weil das der COde ist. Somit schaut der Spieler in die Richtung, wo die Maus ist. Sollte er jedenfalls. Ich poste mal den Code, wird aber auch nicht weiterhelfen.

Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin

 Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);

  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)+200;
  Y := Sin256(Angle)+200;

end;
Zwar kann man hier nicht gehen, dass is aber auch unwichtig, da zuerst mal der SPieler in die richtige Richtung schaun muss, was er aber nicht tut

Binärbaum 25. Feb 2005 16:23

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von ISAS
...
Ich poste mal den Code, wird aber auch nicht weiterhelfen.

Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin

 Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);

  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)+200;
  Y := Sin256(Angle)+200;

end;
Zwar kann man hier nicht gehen, dass is aber auch unwichtig, da zuerst mal der SPieler in die richtige Richtung schaun muss, was er aber nicht tut

Ich weiß zwar nicht genau, was die Funktionen Cos256 und Sin256 berechnen (wenn es Sinus- und Cosinuswerte sind, kann man doch auch sin und cos nehmen, oder besser SinCos), aber ich vermute jetzt mal dass es an den letzten beiden Zeilen liegt:
Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin
  Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);
  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)*200;
  Y := Sin256(Angle)*200;
  {//oder:
   SinCos(Angle, Y, X);
   X:= 200*x;
   Y:= 200*y;}

end;

sniper_w 25. Feb 2005 16:33

Re: Einen Winkel errechnen!?
 
Ich hoffe das hilft:
Delphi-Quellcode:

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Label1: TLabel;
    Label3: TLabel;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  center : tpoint;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.FillRect(ClientRect);

 Canvas.MoveTo(0, height div 2);
 Canvas.LineTo(width, height div 2);

 Canvas.MoveTo(width div 2, 0);
 Canvas.LineTo(width div 2, height);

 center := point(width div 2,height - height div 2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Canvas.Pen.Color := clBlack;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var angle,p : extended;

begin
  angle := 0;
  p := 1;
  FormPaint(self);
  Canvas.MoveTo(width div 2, height div 2);
  Canvas.LineTo(x,y);

  y := Height - y;
  Label1.Caption := 'y-center.Y = '+inttostr(y-center.Y);

  if (x-center.X <>0) then
  begin
   Angle := ArcTan((y-center.Y)/(x-center.X)) * 180 / pi;
   Label3.Caption := 'x-center.X = '+inttostr(x-center.X);

   if (angle<0)and(x-center.X<0) then angle := 180 + angle
        else
   if (x-center.X<0)and(y-center.Y<0) then angle := 180 + angle
        else
   if (y-center.y<0) then angle := 360 + angle;

   Label2.Caption := 'Current angle: '+Floattostr(angle)+ ' degrees.';
  end;
end;

ISAS 25. Feb 2005 17:38

Re: Einen Winkel errechnen!?
 
Danke, hat sehr geholfen. Wusste schon, worans liegt. Nämlich an den 360°, nicht 90°.
Jetzt hab ich nur noch ein Problem. Der richtige Winkel wird angezeigt, doch das Bild dreht sich nicht richtig. Hier ist der Code:

Delphi-Quellcode:
if (Aim.x-Player.X <>0) then
  begin
   Player.Angle := trunc(ArcTan((Aim.y-Player.Y)/(Aim.x-Player.X)) * 180 / pi);
   if (Player.Angle<0)and(Aim.x-Player.X<0) then Player.Angle := 180 + Player.Angle
        else
   if (Aim.x-Player.X<0)and(Aim.y-Player.Y<0) then Player.Angle := 180 + Player.Angle
        else
   if (Aim.y-Player.y<0) then Player.Angle := 360 + Player.Angle;
  end;
  Form1.Label2.Caption:=floattostr((Player.Angle-360)*-1);

  Player.X := Cos256((Player.Angle-360)*-1)+200;
  Player.Y := Sin256((Player.Angle-360)*-1)+200;
Nach dem Label2 das richtige ausgibt, stimmt nur irgendwas mit den letzten 2 Zeilen nicht.. Vielleicht sieht jemand was

Khabarakh 25. Feb 2005 18:52

Re: Einen Winkel errechnen!?
 
Wenn du uns jetzt noch verrätst, was sin256 und cos256 ist :wink: .
Ich verstehe auch dein Problem nicht. Du wolltest, dass der Spieler zum Ziel schaut, wozu veränderst du jetzt dessen Position? Und den Sinn hinter einer Addition oder Subtraktion eines Winkel mit 360° entdecke ich auch nicht (eine Funktion, die den Winkel auf 0..359 bringt, hätte ich noch verstanden).

ISAS 25. Feb 2005 18:59

Re: Einen Winkel errechnen!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also:
sin256, cos256 hab ich beim suchen gefunden (Sprites drehen). Leider kA was die machn.

Der Spieler soll immer in die Richtung der Maus schaun.

Das ganze ist DelphiX, somit kann man mit Angle den Winkel des Spielers festlegen.

Der Winkel wird ja richtig errechnet. Nur das darstellen funktioniert nicht so ganz. Siehe EXE-File

Khabarakh 25. Feb 2005 19:13

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von Khabarakh
Du wolltest, dass der Spieler zum Ziel schaut, wozu veränderst du jetzt dessen Position?

Ich gehe mal davon aus, der Spieler ist dieses blaue Etwas :wink: .

ISAS 25. Feb 2005 20:46

Re: Einen Winkel errechnen!?
 
Also, ich weiss nun, für was das 256 ist. Eine Umdrehung hat nicht 360° sondern 256°

Somit is klar, wiesos nicht funktioniert. Nun nehm ich halt den Winkel, den ich rausbekomme mal 0,711.

0,711 = 256 / 360 /-> Das Verhältnis halt

sniper_w 25. Feb 2005 20:47

Re: Einen Winkel errechnen!?
 
Was mir schon bekannt ist (muss aber nicht richtig sein):
Sin256 sollte ungefäher folgendes machen (99% sicher):
Delphi-Quellcode:
Sin256 := sin( x * pi / (256/2));
Und damit Sin und Sin256 sind nicht gleich. Da sollte auch dein Problem sein.

Zitat:

Und den Sinn hinter einer Addition oder Subtraktion eines Winkel mit 360° entdecke ich auch nicht (eine Funktion, die den Winkel auf 0..359 bringt, hätte ich noch verstanden).
Genau das wird auch gemacht, aber ohne eine neue Funktion zu definieren.

Denn warum das alles ?
Ganz einfach,wiel
Delphi-Quellcode:
 Tan(x) := Tan(180+x);
Deswegen gibt die Funktion ArcTan nicht das gewünschten Resultat. Dieses Resultat muss man später koriegiren, in dem man schaut die Position des Punktes (Tan(x) = Y/X -> Punkt(x,y) ).
Also, pure Triginometrie.

Khabarakh 25. Feb 2005 21:11

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von sniper_w
Genau das wird auch gemacht, aber ohne eine neue Funktion zu definieren.

Gut, ich habe eher Cos256((Player.Angle-360)*-1) gemeint.
Zitat:

Denn warum das alles ?
:?: Was hat das Folgende mit den 2 Feststellungen von oben zu tun?

sniper_w 25. Feb 2005 21:14

Re: Einen Winkel errechnen!?
 
Zitat:

Gut, ich habe eher Cos256((Player.Angle-360)*-1) gemeint.
Wenn du das gemeint hast, dann ist ja alles ein Misverständniss. :zwinker:

Khabarakh 25. Feb 2005 21:41

Re: Einen Winkel errechnen!?
 
Aber ohne weitere Funktion ist es wirklich besser.
:cheers:

supermuckl 25. Feb 2005 22:04

Re: Einen Winkel errechnen!?
 
du darfst net +200 machen sondern *200

Binärbaum 25. Feb 2005 22:50

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von supermuckl
du darfst net +200 machen sondern *200

Das habe ich doch schon weiter oben vorgeschlagen (siehe Quellcode). Allerdings hat ISAS das offensichtlich noch nicht geändert.

ISAS 26. Feb 2005 16:46

Re: Einen Winkel errechnen!?
 
Das versteh ich jetzt nicht. Zwar hab ich das Problem jetzt gelöst und es funktioniert einwandfrei, aber wieso *200. 200 Soll nicht der Drehwinkel werden, sondern die Position. Wenn ich nichts hinschreib, dann is der Spieler ja auf (0 / 0). Mit +200 ist er auf (200 / 200)

Binärbaum 26. Feb 2005 17:07

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von ISAS
Das versteh ich jetzt nicht. Zwar hab ich das Problem jetzt gelöst und es funktioniert einwandfrei, aber wieso *200. 200 Soll nicht der Drehwinkel werden, sondern die Position. Wenn ich nichts hinschreib, dann is der Spieler ja auf (0 / 0). Mit +200 ist er auf (200 / 200)

Mit dem Sinus und Cosinus dazu addiert kommt man doch auch bloß auf Werte im Bereich von 199..201, da Sinus und Cosinus als Wertebereich ja nur das Intervall [-1; 1] haben.
Ich verstehe nicht so richtig, was du sonst mit dem Sinus/ Cosinus bezwecken willst.

MfG
Binärbaum

sniper_w 26. Feb 2005 17:40

Re: Einen Winkel errechnen!?
 
Gerade aufgefallen, passt dieses Thema zum diesem Thread :gruebel: ?
Eher Programmieren Allgemein.

ISAS 26. Feb 2005 17:45

Re: Einen Winkel errechnen!?
 
Naja, passen tuts schon, da es ja einen anderen Anfang hatte. Ich würd sagen, wir lassen dass nun. Es funktioniert ja.

Und der Quellcode von sniper_w hat sehr geholfen, da es die Lösung war


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