Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Winkel im Koordinatensystem berechnen

Winkel im Koordinatensystem berechnen

Universität / Fachhochschule

Tags: Koordinatensystem, Kreis, Trigonometrie

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
Ratefuchs

Ratefuchs aktiv_icon

05:03 Uhr, 02.03.2024

Antworten
Hallo,
ich bin schon Rentner und hobbymässig im Elektronikbereich unterwegs und brauche etwas Hilfe.

Ein Joystick liefert mir über zwei Potis Werte der x-Achse und Werte der y-Achse. Um weiter programmieren zu können, brauche ich den Winkel der Position, in der ich den Joystick bewege.

Als Bild habe ich ein Koordinatensystem beigefügt, auf der Beispielpunkte eingezeichnet sind.

Gibt es eine Formel, mit der ich den Winkel (0-360°) berechnen kann?

Kann mir jemand eine Beispielrechnung zeigen? Ich habe mit meinen Kenntnissen (z.B. Pythagoras) nichts gefunden, was mir weiterhilft.

Vielen Dank




Screenshot_20240301_095249_Chrome

Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert):
"Ich benötige bitte nur das Ergebnis und keinen längeren Lösungsweg."
Hierzu passend bei OnlineMathe:
Kreiszahl (Mathematischer Grundbegriff)
Kreis (Mathematischer Grundbegriff)
Elementare Kreisteile (Mathematischer Grundbegriff)
Sinus (Mathematischer Grundbegriff)
Kosinus (Mathematischer Grundbegriff)
Trigonometrie (Mathematischer Grundbegriff)
Tangens (Mathematischer Grundbegriff)
Rechenregeln Trigonometrie

Online-Übungen (Übungsaufgaben) bei unterricht.de:
 
Online-Nachhilfe in Mathematik
Antwort
Roman-22

Roman-22

06:36 Uhr, 02.03.2024

Antworten
> brauche ich den Winkel der Position
Welchen Winkel? In der Zeichnung ist auch keiner eingetragen.
Ich gehe mal davon aus, dass du den Winkel zur nach rechts positiv orientierten x-Achse meinst.

Den erhältst du mit der arctan Funktion, die in deiner Programmiersprache vielleicht auch mit atan bezeichnet wird.

Etwa für den Punkt K(6/5) ist der Winkel arctan(56)0,69473839,805571.
Üblicherweise liefern die Programme den Winkel im Bogenmaß (Radiant). Durch Multiplikation mit 180π erhältst du dann den Winkel in (Alt)-Grad.

Aber die Verwendung der Tangensfunktion birgt einige Tücken. Zum einen liefert sie nur Winkel im Bereich (-90;+90). Da du nur positive Winkelwerte möchtest, müsstest du im Falle eines negativen Ergebnisses eben noch 360 addieren.

Schwerwiegender ist da noch, dass die Formel φ=arctan(yx) nur für x>0 gültig ist.
Für x<0 musst du zum Ergebnis noch 180 addieren. Und den Fall x=0 (das würde eine Division durch Null ergeben) musst du in deinem Programm dann auch noch extra behandeln. Hier entscheidet das Vorzeichen von y ob der Winkel 90 oder 270 ist und im Fall x=y=0 ist er unbestimmt.

Diese ganzen Fallunterscheidungen zu programmieren ist nicht schwer, aber lästig.
Möglicherweise stellt dein Programmiersystem aber auch eine atan2() Funktion zur Verfügung.
Diese Funktion hat üblicherweise 2 Argumente (x und y) und berücksichtigt all die oben erwähnten Fallunterscheidungen automatisch.
Allerdings solltest du in der Dokumentation nachsehen, in welcher Reihenfolge diese Funktion die Argumente erwartet. Mir ist schon sowohl atan2(x,y), als auch atan2(y,x) untergekommen.
In Programmiersprachen woe C oder Python ist es meist atan2(x,y), in Anwenderprogrammen wie Tabellenkalkulationen oder Mathe-Programmen meist atan2(x,y) - aber das ist keine feste Regel.
Außerdem musst du nachsehen, in welchem Bereich der zurückgelieferte Winkel liegt. Das kann, wie von dir gewünscht, [0;2π) sein, ist aber oft auch (-π;π]. In diesem Fall müsstest du eben selbst bei negativen Winkeln 2π bzw. 360 dazu addieren.

Wenn die Programmiersprache auch mit komplexen Zahlen umgehen kann, dann könnte sie auch eine Funktion arg() zur Verfügung stellen, welche du ebenfalls für deine Zwecke benutzen könntest arg(6+5i)0,694738.
Ich schätze aber, dass du wahrscheinlich eher das ganze maschinennahe, vielleicht in einem μC realisieren möchtest.

Viel Erfolg!

Ratefuchs

Ratefuchs aktiv_icon

07:08 Uhr, 02.03.2024

Antworten
Hallo Roman,

Vielen Dank für die schnelle Antwort. Das muss ich jetzt erstmal durcharbeiten.

bezgl. Winkel:
Wo angefangen wird, ist mir egal.
Ratefuchs

Ratefuchs aktiv_icon

17:32 Uhr, 25.03.2024

Antworten
Hallo,

Ich habe mir aus dem Netz nun die passende Formel rausgesucht und werte die Joystick-Koordinaten aus, allerdings erhalte ich - wenn x und y- positiv sind - positive Winkel bis 180 Grad. Ist ein Teil negativ, erhalte ich negative Winkel bis -180 Grad.

atan2(x,y)*180/3,14

...lieber wären mir Winkel im Bereich 0 bis 360 Grad.

Hat jemand einen Tipp was ich machen könnte?

Danke
Antwort
Roman-22

Roman-22

21:23 Uhr, 25.03.2024

Antworten
Wenn x und y beide positiv sind, wirst du wohl nur Winkel in Bereich von 0° bis 90° erhalten, oder?

Was die negativen Winkel anlangt, so bau doch einfach eine Verzweigung ein und addiere 360° ( 2π), falls der Wert negativ ist. Das hatte ich in meiner vorherigen Antwort ja auch vorgeschlagen.

Alternativ kannst du dir ja auch eine eigene Funktion atan3 schreiben, in der genau diese Verzweigung eingebaut ist. Vermutlich ist das effizienter.
Ratefuchs

Ratefuchs aktiv_icon

21:35 Uhr, 25.03.2024

Antworten
Ja...Du hast recht mit den 90 Grad.

Ich seh's gerade ...

atan2(-512,-512)= -135

Ich hätte es, wenn ich von 360 die -135 abziehen =225

...oder?
Antwort
Randolph Esser

Randolph Esser aktiv_icon

23:39 Uhr, 25.03.2024

Antworten
Hier ein Basic-Pseudocode:

prozedur MachWinkel (x as double, y as double)

local w as double

if |x||y|

   if x>0

     if y0:w=arccos(xx2+y2)

     else: w=2π-arccos(xx2+y2)

     end if

   else

     if x<0

       if y0:w=π-arccos(|x|x2+y2)

       else: w=π+arccos(|x|x2+y2)

       end if

     else: w=0

     end if

   end if

else

     if y>0

       if x0:w=arcsin(yx2+y2)

       else: w=π-arcsin(yx2+y2)

       end if

     else

       if x0:w=2π-arcsin(|y|x2+y2)

       else: w=π+arcsin(|y|x2+y2)

       end if

     end if

end if

return 180πw





Bemerkung:

Rein mathematisch bzw. logisch wäre schon ausreichend:

prozedur MachWinkel (x as double, y as double)

local w as double

if x>0

     if y>0:w=arccos(xx2+y2)

     else: w=2π-arccos(xx2+y2)

     end if

else

   if x<0

     if y0:w=π-arccos(|x|x2+y2)

     else: w=π+arccos(|x|x2+y2)

     end if

   else: w=0

   end if

end if

return 180πw


Am Rechner kann es dann aber böse Überraschungen geben

(Division einer sehr kleinen Zahl durch eine relativ große Zahl, usw...).

Oben wird das durch die Unterscheidung

if |x||y|

   ######## arccos- Block und Fall x=y=0

else

   ######## arcsin- Block

end if

verhindert.

Die Argumente für die arccos bzw. arcsin Funktion sind dort immer zwischen 12 und 1.


Den Fall x=y=0, für den ich w=0 setze, kann man auch noch aus dem Code rausoptimieren,

indem man einfach bei Aufruf der Prozedur für w=0 sorgt

und die Fallunterscheidung dahingehend leicht ändert,

dass für diesen Fall dann mit w nichts weiter passiert

- spart ein "if ... else ... end if".

Oben habe ich diesen Fall aber mal schaltungstechnisch mit eingeflochten (Spielkind)...




Antwort
HAL9000

HAL9000

09:14 Uhr, 26.03.2024

Antworten
> In Programmiersprachen woe C oder Python ist es meist atan2(x,y)

Kleiner Copy+Paste-Fehler: An dieser Stelle meinst du sicher atan2(y,x).

Ratefuchs

Ratefuchs aktiv_icon

09:47 Uhr, 26.03.2024

Antworten
Danke Kartoffelkäfer. Cool.
Ratefuchs

Ratefuchs aktiv_icon

09:49 Uhr, 26.03.2024

Antworten
HAL 9000 ....Du hast recht. ...y,x.

Ich programmiere einen Arduino.
Antwort
HAL9000

HAL9000

10:00 Uhr, 26.03.2024

Antworten
Und in welcher Programmiersprache? Zumindest in C/C++/Python/Java ist es immer die Reihenfolge atan2(y,x). Vermutlich begnügst du dich mit float statt double, in dem Fall kann es in C/C++ so aussehen

float atan3grad (float y, float x)
{
float w = atan2(y,x) * 180.0f/M_PI;
if (w < 0.0f)
{
w += 360.0f;
}
return w;
}

Kurzum, wenn atan2 zur Verfügung steht, sollte man es besser auch nehmen. Die Alternativen von Kartoffelkäfer sind dann eher dafür, wenn dies nicht der Fall ist.


P.S.: Die Forumsoftware hat leider was gegen Einrückungen im Code ... schade.

Ratefuchs

Ratefuchs aktiv_icon

10:10 Uhr, 26.03.2024

Antworten
Das probiere ich aus
Ratefuchs

Ratefuchs aktiv_icon

10:11 Uhr, 26.03.2024

Antworten
Das probiere ich aus. Danke :-)

... in C und C++
Antwort
HAL9000

HAL9000

10:18 Uhr, 26.03.2024

Antworten
Ups, kleiner Fehler: Wenn du "float" nimmst, dann ist besser (vor allem schneller) die Funktion "atan2f" statt "atan2".
Antwort
Roman-22

Roman-22

10:18 Uhr, 26.03.2024

Antworten
> Kleiner Copy+Paste-Fehler: An dieser Stelle meinst du sicher atan2(y,x).
Ja, richtig. Sonst wär der in dem Satz implizierte Unterschied zu Tabellekalkulationsprogrammen, etc. ja auch nicht so groß ;-)
War aber kaum Copy&Paste sondern eher gedankenloses Tippen...
Frage beantwortet
Ratefuchs

Ratefuchs aktiv_icon

16:22 Uhr, 26.03.2024

Antworten
Allen ein dickes Danke. Es funktioniert nun so, wie ich es brauche.
Antwort
Randolph Esser

Randolph Esser aktiv_icon

18:42 Uhr, 26.03.2024

Antworten
Hier noch eine Visualisierung der "if ... else ... end if" - Verschachtelungen.

Machwinkel