Kursberechnung wie?

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Kursberechnung wie?

Beitrag von Syntacks_Error »

Ich habe eine Position x,y mit x und y als positive Zahlen.

Außerdem habe ich eine entsprechende Position x1,y2 mit irgendwelchen anderen positiven Zahlen.

Der Nullpunkt liegt oben links.

Wie errechne ich den Kurswinkel (in Grad) von Position x,y zu Position x1,y1?

Ich bin schon darauf gekommen, daß das etwas mit Tangens, Atan und den Entfernungen der Punkte auf der x- und y-Achse zu tun hat. Nur die Berechnung klappt nicht, es kommen immer unpassende Werte im Bereich von -90 bis 90 Grad heraus.

Beispiel:

Code: Alles auswählen

x.i = 200
y.i = 100

x1.i = 100
y1.i = 500

x_entfernung = x1.i - x.i
y_entfernung = y1.i - y.i

tan.f = x_entfernung.i/y_entfernung.i
kurswinkel_radiant.f = ATan(tan.f) 
kurswinkel_grad.f = kurswinkel_radiant.f*180/3.14

Debug "Tan " + StrF(tan.f,2)
Debug "Kurswinkel_Radiant " + StrF(kurswinkel_radiant.f,2)
Debug "Kurswinkel_Grad     " + StrF(kurswinkel_grad.f,2)
Herauskommen sollte da eigentlich so etwa 190 Grad, tut es aber nicht. Ich vermute, ich muß die Werte noch weiterverarbeiten, aber wie, wann, wie und warum?

Wie die Kenner vermutlich schon vermuten, habe ich nur eine ungefähre Vorstellung von dem, was eigentlich Tangens, Radiant und so ist ;-(
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, eigentlich braucht man drei Punkte um einen Winkel zu definieren.
nimmst du als dritten den nullpunkt?

außerdem liegt im grunde jeder winkel zwischen 0 und 180 grad,
bei größeren muss man definieren dass man den außenwinkel meint.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Beitrag von Syntacks_Error »

Ich bin da wohl in der Tat etwas naiv rangegangen. Habe aber inzwischen die ATan2-Procedure im Forum gefunden (Man ahnt ja nicht, daß sich mit soetwas schon mal jemand beschäftigt hat). Verstehe zwar nicht, was die macht, aber wenn ich das Ergebnis (Radiant) *180/pi nehme und 90 addiere (Warum denn das?) kommen ganz glaubhafte Werte heraus. Scheint also schon gelöst zu sein.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Syntacks_Error hat geschrieben:(Warum denn das?)
Bild
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Wenn man den Einheitskreis mit Sinus und Cosinus berechnet und von 0° bis 360° mit dem
Winkel läuft, dann beginnt die Kreislinie rechts, läuft nach oben, dann nach links, nach
unten und wieder nach rechts. Da beim Computer der Nullpunkt aber oben links ist und die
y-Achse nach unten statt nach oben zeigt, wird sich der Kreis mit dem Uhrzeigersinn
drehen.
Das heißt ein Winkel von 0° gibt dir in deinem Fall an, dass der Kurs nach rechts ging, ein
Winkel von 90° nach unten, 180° nach links und 270° nach oben.

Bisher machen das noch alle atan-Funktionen, die ich kenne, so.
Klaus_1963
Beiträge: 96
Registriert: 25.06.2009 09:09

Beitrag von Klaus_1963 »

Hallo Syntax Error :-)

Habe mal nachgerechnet: wenn x die horizontale (!) Achse charakterisiert, y die vertikale, dann komme ich mit Deinen Werten auf einen Winkel zur Horizontalen von etwa 104°*. Deine Formeln sind ja ok. Hoffe, mir ist kein Rechenfehler unterlaufen ;-). Habe zuerst auch falsch gerechnet: passiert recht leicht; hoffe nun stimmt's :-)

* im Uhrzeigersinn!!! oder eben 256° gegen Uhrzeigersinn (bla, bla, bla... ich weis)

So long, Klaus
PureBasic 5.72 LTS / Windows / MacOS / Linux Mint / starker Kaffee / noch stärkerer Kaffee / reines Koffein intravenös...
Motto: Hauptsache es funktioniert - aber schnell und richtig!
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Beitrag von Syntacks_Error »

Mein erste Formel funktioniert wohl nur - wenn überhaupt - in einem bestimmten Winkelbereich.

Die Atan2 funktionierte allerdings dann doch nicht (auch nicht mit + 90 Grad oder was auch immer) oder allenfalls bei bestimmten Winkel (irgendwie 90 Grad und ein Vielfaches, glaube ich).
Möglicherweise liegt das daran, daß der Nullpunkt der Karte jedenfalls in meinem Fall nicht links oben, sondern links unten liegt.

Nach Versuch und Irrtum funktioniert dabei das hier:

Code: Alles auswählen


Procedure.f ATan3(y.i,x.i) 
; y + x gegenüber Funktionsaufruf vertauscht!
; gibt direkt Kurswinkel zurück
; x(0),y(0) = links unten

  If y > 0 And x < 0 
   ProcedureReturn ATan(y/x) * 180/#PI +180;
  ElseIf y < 0 And x < 0 
   ProcedureReturn  ATan(y/x) *180/#PI + 180
  ElseIf y < 0 And x > 0 
   ProcedureReturn ATan(y/x) *180/#PI + 360 
  ElseIf y > 0 And x > 0
   ProcedureReturn ATan(y/x) *180/#PI
  ElseIf y < 0 And x = 0 
   ProcedureReturn 270
  ElseIf y > 0 And x = 0 
   ProcedureReturn 90
  ElseIf y = 0 And x < 0 
   ProcedureReturn 180
  ElseIf y = 0 And x > 0 
   ProcedureReturn 360  
  EndIf
    
EndProcedure

winkel.f = ATan3(xpos_ziel.i-xpos.i, ypos_ziel.i-ypos.i)
- Gibt Winkel direkt zurück
- x(0), y(0): Links unten
- Ob die Regeln für 0, 90, ... Grad erforderlich sind, weiß ich nicht ;-)
- x- und y- Werte müssen in der Funktion gegenüber dem Aufruf vertauscht sein. Ist natürlich Murks, vermutlich müßte man die Winkeladditionen andern.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

08 Aug 2009 12:09:28, Syntacks_Error hat geschrieben:Möglicherweise liegt das daran, daß der Nullpunkt der Karte jedenfalls in meinem Fall nicht links oben, sondern links unten liegt.
05 Aug 2009 19:10:55, Syntacks_Error hat geschrieben:Der Nullpunkt liegt oben links.
Kartoffelpü?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Beitrag von Syntacks_Error »

"Links oben" war schlicht ein Irrtum - tatsächlich ist er halt bei dem Programm, um das es geht, links unten.
Antworten