In einer Programmiersprache (Python, C # usw.) muss ich bestimmen, wie der Winkel zwischen einer Linie und der horizontalen Achse berechnet wird.
Ich denke, ein Bild beschreibt am besten, was ich will:
Was ist bei (P1 x , P1 y ) und (P2 x , P2 y ) der beste Weg, um diesen Winkel zu berechnen? Der Ursprung liegt oben links und es wird nur der positive Quadrant verwendet.
c#
python
trigonometry
orlp
quelle
quelle
Antworten:
Finden Sie zuerst den Unterschied zwischen dem Startpunkt und dem Endpunkt (hier handelt es sich eher um ein gerichtetes Liniensegment, nicht um eine "Linie", da sich Linien unendlich erstrecken und nicht an einem bestimmten Punkt beginnen).
Berechnen Sie dann den Winkel (der von der positiven X-Achse bei
P1
zur positiven Y-Achse bei verläuftP1
).Dies ist jedoch
arctan
möglicherweise nicht ideal, da durch die Aufteilung der Unterschiede auf diese Weise die Unterscheidung aufgehoben wird, die zur Unterscheidung des Quadranten erforderlich ist, in dem sich der Winkel befindet (siehe unten). Verwenden Sie stattdessen Folgendes, wenn Ihre Sprache eineatan2
Funktion enthält:BEARBEITEN (22. Februar 2017): Im Allgemeinen wird jedoch
atan2(deltaY,deltaX)
nur aufgerufen , um den richtigen Winkel fürcos
undsin
möglicherweise unelegant zu finden. In diesen Fällen können Sie stattdessen häufig Folgendes tun:(deltaX, deltaY)
als Vektor.deltaX
unddeltaY
durch die Länge des Vektors (sqrt(deltaX*deltaX+deltaY*deltaY)
), es sei denn, die Länge ist 0.deltaX
nun der Kosinus des Winkels zwischen dem Vektor und der horizontalen Achse (in Richtung von der positiven X- zur positiven Y-Achse beiP1
).deltaY
wird jetzt der Sinus dieses Winkels sein.EDIT (28. Februar 2017): Auch ohne Normalisierung
(deltaX, deltaY)
:deltaX
zeigt an, ob der in Schritt 3 beschriebene Cosinus positiv oder negativ ist.deltaY
zeigt an, ob der in Schritt 4 beschriebene Sinus positiv oder negativ ist.deltaX
unddeltaY
geben an, in welchem Quadranten sich der Winkel in Bezug auf die positive X-Achse befindetP1
:+deltaX
,+deltaY
: 0 bis 90 Grad.-deltaX
,+deltaY
: 90 bis 180 Grad.-deltaX
,-deltaY
: 180 bis 270 Grad (-180 bis -90 Grad).+deltaX
,-deltaY
: 270 bis 360 Grad (-90 bis 0 Grad).Eine Implementierung in Python mit Bogenmaß (bereitgestellt am 19. Juli 2015 von Eric Leschinski, der meine Antwort bearbeitet hat):
Alle Tests bestehen. Siehe https://en.wikipedia.org/wiki/Unit_circle
quelle
90 - angleInDegrees
?Entschuldigung, aber ich bin mir ziemlich sicher, dass Peters Antwort falsch ist. Beachten Sie, dass die y-Achse die Seite entlang verläuft (häufig in Grafiken). Daher muss die DeltaY-Berechnung umgekehrt werden, sonst erhalten Sie die falsche Antwort.
Erwägen:
gibt
Wenn also im obigen Beispiel P1 (1,1) und P2 (2,2) ist [weil Y auf der Seite zunimmt], gibt der obige Code für das gezeigte Beispiel 45,0 Grad an, was falsch ist. Ändern Sie die Reihenfolge der DeltaY-Berechnung und sie funktioniert ordnungsgemäß.
quelle
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
Ich habe in Python eine Lösung gefunden, die gut funktioniert!
quelle
Wenn Sie die genaue Frage berücksichtigen und uns in ein "spezielles" Koordinatensystem versetzen, in dem eine positive Achse bedeutet, dass Sie sich nach UNTEN bewegen (wie ein Bildschirm oder eine Schnittstellenansicht), müssen Sie diese Funktion wie folgt anpassen und die Y-Koordinaten negativ machen:
Beispiel in Swift 2.0
Diese Funktion gibt eine korrekte Antwort auf die Frage. Die Antwort ist im Bogenmaß, daher lautet die Verwendung zum Anzeigen von Winkeln in Grad:
quelle
Basierend auf der Referenz "Peter O". Hier ist die Java-Version
quelle
Matlab-Funktion:
quelle
Eine Formel für einen Winkel von 0 bis 2 pi.
Es gibt x = x2-x1 und y = y2-y1. Die Formel funktioniert für
ein beliebiger Wert von x und y. Für x = y = 0 ist das Ergebnis undefiniert.
f (x, y) = pi () - pi () / 2 * (1 + Vorzeichen (x)) * (1-Zeichen (y ^ 2))
quelle
quelle
Testen
Zum Testen lasse ich die Hypothese Testfälle generieren.
quelle