![]() |
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! |
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 |
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.
|
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 |
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.
|
Re: Einen Winkel errechnen!?
Zitat:
MfG Binärbaum |
Re: Einen Winkel errechnen!?
Zitat:
Cos(Alpha)=Ankathete / Hypotenuse Tan(Alpha)=Gegenkathete / Ankathete Du hast Recht Binärbaum. ;) |
Re: Einen Winkel errechnen!?
Zitat:
Zitat:
|
Re: Einen Winkel errechnen!?
Also dann kann man das folgendermaßen umsetzen:
Delphi-Quellcode:
Ist doch garnicht so schwer, wenn man die mathematischen Grundlagen (und die Delphi-Funktionen) kennt. :)
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 MfG Binärbaum |
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 |
Re: Einen Winkel errechnen!?
Zitat:
Komme irgendwie nicht so richtig hin, da ich will, dass ein Sprite immer dahin schaut, wo die Maus ist. |
Re: Einen Winkel errechnen!?
Zitat:
|
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:
Aim.Y-Player.Y ergibt die Gegenkathete
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Aim.X-Player.X ergibt die Ankathete |
Re: Einen Winkel errechnen!?
Delphi-Quellcode:
Warum nicht so:
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Delphi-Quellcode:
Am sonsten, wenn du uns Code posten würdest, könnten wir hilfreicher sein.
Angle:=Round((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
|
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:
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
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; |
Re: Einen Winkel errechnen!?
Zitat:
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; |
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; |
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:
Nach dem Label2 das richtige ausgibt, stimmt nur irgendwas mit den letzten 2 Zeilen nicht.. Vielleicht sieht jemand was
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; |
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). |
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 |
Re: Einen Winkel errechnen!?
Zitat:
|
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 |
Re: Einen Winkel errechnen!?
Was mir schon bekannt ist (muss aber nicht richtig sein):
Sin256 sollte ungefäher folgendes machen (99% sicher):
Delphi-Quellcode:
Und damit Sin und Sin256 sind nicht gleich. Da sollte auch dein Problem sein.
Sin256 := sin( x * pi / (256/2));
Zitat:
Denn warum das alles ? Ganz einfach,wiel
Delphi-Quellcode:
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) ).
Tan(x) := Tan(180+x);
Also, pure Triginometrie. |
Re: Einen Winkel errechnen!?
Zitat:
Zitat:
|
Re: Einen Winkel errechnen!?
Zitat:
|
Re: Einen Winkel errechnen!?
Aber ohne weitere Funktion ist es wirklich besser.
:cheers: |
Re: Einen Winkel errechnen!?
du darfst net +200 machen sondern *200
|
Re: Einen Winkel errechnen!?
Zitat:
|
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)
|
Re: Einen Winkel errechnen!?
Zitat:
Ich verstehe nicht so richtig, was du sonst mit dem Sinus/ Cosinus bezwecken willst. MfG Binärbaum |
Re: Einen Winkel errechnen!?
Gerade aufgefallen, passt dieses Thema zum diesem Thread :gruebel: ?
Eher Programmieren Allgemein. |
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 20:07 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