Re: Winkel zwischen zwei Punkten?!
ist ähnlich simpel - Punkt in Polarkoordinaten umrechnen (Winkel zwischen 0 und 2PI).
Zum Winkel dann (2*PI/16) addieren, modulo 2 PI nehmen und dann mit 8/(2*PI) multiplizieren, Dezimalstellen abschneiden und fertig ;) Den Winkel bekommst du mit der Funktion arctan2() aus der Math-Unit. Um zu verstehen, was passiert kannst du dir das mal auf einem Blatt Papier verständlich machen - es wird ja im Grunde nur der Winkel genommen und in eine Richtung überführt. Wenn du es immernoch nicht vestehst, mach mal eine Tabelle, welcher Winkel welche Zahl bekommen soll. Also z.B. 0° =>0 22°=>0 23°=>1 45°=>1 67°=>1 68°=>2 ... 337°=>7 338°=>0 359°=>0 Also ist die Lösung, einen Winkel draufzuaddieren, das Ergebnis passend zu teilen und dann die Kommastellen abzuschneiden (Übergang kontinuierlich=>diskret) |
Re: Winkel zwischen zwei Punkten?!
Danke,hier am Laptop hab ich kein Delphi. Werds dann später testen und Rückmeldung geben :cheers: :coder:
|
Re: Winkel zwischen zwei Punkten?!
Hi, folgenden Code hab ich mal zum Testen eingegeben.
Delphi-Quellcode:
Da erhalte ich die meldung:
Zahl := arctan2(Aim.Y, Aim.X);
Zahl := Zahl + (2*PI/16); Zahl := Zahl mod 2*Pi; Zahl := Zahl * (8/(2*PI)); Showmessage(IntToStr(round(Zahl))); Zitat:
Danke nochmal, mfG |
Re: Winkel zwischen zwei Punkten?!
nein, haste schon richtig verstanden.
Wenn es in der Math-Unit keine Mod-Funktion für Gleitkommazahlen gibt, reicht auch ein
Delphi-Quellcode:
Das erledigt dann auch gleich die "zwischen 0 und 2 Pi"-Sache (arctan2() liefert evtl. auch negative Werte zurück)
if zahl > 2*Pi then zahl := zahl - 2*Pi;
if zahl < 0 then zahl := zahl + 2*Pi; |
Re: Winkel zwischen zwei Punkten?!
Danke, aber jetzt bekomme ich mit:
Delphi-Quellcode:
Nur entweder eins oder zwei zurückgegeben. Da muss wohl was falschgelaufen sein...?
Zahl := arctan2(Aim.Y, Aim.X);
Zahl := Zahl + (2*PI/16); //Zahl := Zahl mod 2*Pi; if zahl > 2*Pi then zahl := zahl - 2*Pi; if zahl < 0 then zahl := zahl + 2*Pi; Zahl := Zahl * 8/(2*PI); Showmessage(IntToStr(round(Zahl))); |
Re: Winkel zwischen zwei Punkten?!
jfheins schrieb:
Delphi-Quellcode:
Der Tangens hat eine Periodizität von 180 Grad (oder pi):
if zahl > 2*Pi then zahl := zahl - 2*Pi;
if zahl < 0 then zahl := zahl + 2*Pi; Versuche 'mal
Delphi-Quellcode:
Gruß
if zahl > Pi then zahl := zahl - Pi;
if zahl < 0 then zahl := zahl + Pi; Wolfgang |
Re: Winkel zwischen zwei Punkten?!
Möööp :mrgreen:
Der Tangens interessiert gar nicht, es wird einmal der arkustangens berechnet und dann ist das nur noch ein Winkel, und der geht schon einmal ganz um den Kreis - also im Intervall 0..2PI oder 0..360° ;) Also ich weis nicht, was du machst, aber mein Testcode geht:
Code:
Vergisst du vll. vorher die Koordinaten des Ursprungs abzuziehen?
private void Form1_MouseMove(object sender, MouseEventArgs e)
{ label5.Text = string.Format("X: {0}\t Y: {1}", e.X, e.Y); var x = e.X - 150; var y = e.Y - 150; var Winkel = Math.Atan2(y, x); label1.Text = (Winkel * 180 / Math.PI).ToString() + " °"; Winkel = Winkel + (2 * Math.PI / 16); label2.Text = (Winkel * 180 / Math.PI).ToString() + " °"; if (Winkel > 2 * Math.PI) Winkel = Winkel - 2 * Math.PI; if (Winkel < 0) Winkel = Winkel + 2 * Math.PI; label3.Text = (Winkel * 180 / Math.PI).ToString() + " °"; var Linie = Math.Truncate(Winkel * 8 / (2 * Math.PI)); label4.Text = Linie.ToString(); } |
Re: Winkel zwischen zwei Punkten?!
@jfheins
Zitat:
Ansonsten teile ich auch deine Meinung mit den Ursprungskoordinaten. Probiere 'mal bitte Gruß Wolfgang |
Re: Winkel zwischen zwei Punkten?!
Zitat:
Durch die Beschränkung auf den Bereich 0..180° wird nur noch ein Halbkreis abgedeckt, statt der ganze Kreis. Das Ergebnis ist, dass rechts 0 kommt, dann nach unten rechts die 1 dann nach unten die 2 und nach unten links die 3. Anstatt danach aber mit 4-7 weiter zugehen, fängt es wieder bei 0 an. Ist ja auch logisch, wenn der obere Halbkreis durch das if winkel > pi then einkel := winkel - pi auf den unteren Halbkreis abgebildet wird ;) |
Re: Winkel zwischen zwei Punkten?!
Ok, danke für den Test.
Irren ist menschlich, sprach der Igel und stieg von der Drahtbürste ;-) Gruß Wolfgang |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 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