![]() |
---|
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 . Pythagoras) nichts gefunden, was mir weiterhilft. Vielen Dank 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: Definition von Sinus, Kosinus und Tangens Einführung Funktionen Grundbegriffe der ebenen Geometrie Kreis und Mittelsenkrechte |
![]() |
![]() |
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 Funktion, die in deiner Programmiersprache vielleicht auch mit bezeichnet wird. Etwa für den Punkt ist der Winkel . Üblicherweise liefern die Programme den Winkel im Bogenmaß (Radiant). Durch Multiplikation mit 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 . Da du nur positive Winkelwerte möchtest, müsstest du im Falle eines negativen Ergebnisses eben noch addieren. Schwerwiegender ist da noch, dass die Formel nur für gültig ist. Für musst du zum Ergebnis noch addieren. Und den Fall (das würde eine Division durch Null ergeben) musst du in deinem Programm dann auch noch extra behandeln. Hier entscheidet das Vorzeichen von ob der Winkel oder ist und im Fall ist er unbestimmt. Diese ganzen Fallunterscheidungen zu programmieren ist nicht schwer, aber lästig. Möglicherweise stellt dein Programmiersystem aber auch eine Funktion zur Verfügung. Diese Funktion hat üblicherweise 2 Argumente und 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 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, sein, ist aber oft auch . In diesem Fall müsstest du eben selbst bei negativen Winkeln bzw. dazu addieren. Wenn die Programmiersprache auch mit komplexen Zahlen umgehen kann, dann könnte sie auch eine Funktion zur Verfügung stellen, welche du ebenfalls für deine Zwecke benutzen könntest . Ich schätze aber, dass du wahrscheinlich eher das ganze maschinennahe, vielleicht in einem realisieren möchtest. Viel Erfolg! |
![]() |
Hallo Roman, Vielen Dank für die schnelle Antwort. Das muss ich jetzt erstmal durcharbeiten. bezgl. Winkel: Wo angefangen wird, ist mir egal. |
![]() |
Hallo, Ich habe mir aus dem Netz nun die passende Formel rausgesucht und werte die Joystick-Koordinaten aus, allerdings erhalte ich - wenn und positiv sind - positive Winkel bis Grad. Ist ein Teil negativ, erhalte ich negative Winkel bis Grad. atan2(x,y)*180/3,14 ...lieber wären mir Winkel im Bereich 0 bis Grad. Hat jemand einen Tipp was ich machen könnte? Danke |
![]() |
Wenn und 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° ( 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. |
![]() |
Ja...Du hast recht mit den Grad. Ich seh's gerade . atan2(-512,-512)= Ich hätte es, wenn ich von die abziehen ...oder? |
![]() |
Hier ein Basic-Pseudocode: prozedur MachWinkel as double, as double) local as double if if if else: end if else if if else: end if else: end if end if else if if else: end if else if else: end if end if end if return Bemerkung: Rein mathematisch bzw. logisch wäre schon ausreichend: prozedur MachWinkel as double, as double) local as double if if else: end if else if if else: end if else: end if end if return 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 ######## Block und Fall else ######## Block end if verhindert. Die Argumente für die bzw. Funktion sind dort immer zwischen und 1. Den Fall für den ich setze, kann man auch noch aus dem Code rausoptimieren, indem man einfach bei Aufruf der Prozedur für sorgt und die Fallunterscheidung dahingehend leicht ändert, dass für diesen Fall dann mit nichts weiter passiert - spart ein "if . else . end if". Oben habe ich diesen Fall aber mal schaltungstechnisch mit eingeflochten (Spielkind)... |
![]() |
> 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). |
![]() |
Danke Kartoffelkäfer. Cool. |
![]() |
HAL ....Du hast recht. . Ich programmiere einen Arduino. |
![]() |
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. |
![]() |
Das probiere ich aus |
![]() |
Das probiere ich aus. Danke :-) . in und |
![]() |
Ups, kleiner Fehler: Wenn du "float" nimmst, dann ist besser (vor allem schneller) die Funktion "atan2f" statt "atan2". |
![]() |
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... |
![]() |
Allen ein dickes Danke. Es funktioniert nun so, wie ich es brauche. |
![]() |
Hier noch eine Visualisierung der "if . else . end if" - Verschachtelungen. |