Welchen Wert hat der kleinste der beiden Winkel zwischen zwei Winkeln im Bereich -PI -> PI um eine Koordinate?
Berücksichtigt man, dass die Differenz zwischen PI und -PI nicht 2 PI, sondern Null beträgt.
Beispiel:
Stellen Sie sich einen Kreis vor, bei dem zwei Linien aus der Mitte herauskommen. Zwischen diesen Linien befinden sich zwei Winkel, der Winkel, den sie innen bilden, auch bekannt als der kleinere Winkel , und der Winkel, den sie außen bilden, auch bekannt als der größere Winkel. Beide Winkel ergeben zusammen einen vollen Kreis. Da jeder Winkel in einen bestimmten Bereich passen kann, wie hoch ist der Wert für kleinere Winkel unter Berücksichtigung des Überschlags
language-agnostic
geometry
angle
Tom J Nowell
quelle
quelle
Antworten:
Dies ergibt einen vorzeichenbehafteten Winkel für alle Winkel:
Beachten Sie, dass die
modulo
Operation in vielen Sprachen einen Wert mit dem gleichen Vorzeichen wie die Dividende zurückgibt (wie C, C ++, C #, JavaScript, vollständige Liste hier ). Dies erfordert eine benutzerdefiniertemod
Funktion wie folgt:Oder so:
Wenn die Winkel innerhalb von [-180, 180] liegen, funktioniert dies auch:
Ausführlicher:
quelle
a -= 360*sgn(a)*(abs(a) > 180)
. (Denken Sie darüber nach, wenn Sie verzweigungslose Implementierungen vonsgn
und habenabs
, dann könnte diese Eigenschaft tatsächlich anfangen, die Notwendigkeit von zwei Multiplikationen zu kompensieren.)double targetA = 2; double sourceA = 359;
'a' ist gleich -357,0 statt 3,0x ist der Zielwinkel. y ist die Quelle oder der Startwinkel:
Es gibt den vorzeichenbehafteten Delta-Winkel zurück. Beachten Sie, dass die Reihenfolge der Parameter für die Funktion atan2 () je nach API unterschiedlich sein kann.
quelle
x-y
gibt Ihnen den Unterschied im Winkel, aber es kann außerhalb der gewünschten Grenzen liegen. Stellen Sie sich diesen Winkel vor, der einen Punkt auf dem Einheitskreis definiert. Die Koordinaten dieses Punktes sind(cos(x-y), sin(x-y))
.atan2
Gibt den Winkel für diesen Punkt zurück (der äquivalent zu istx-y
), außer dass sein Bereich [-PI, PI] ist.Wenn Ihre beiden Winkel x und y sind, ist einer der Winkel zwischen ihnen abs (x - y). Der andere Winkel ist (2 * PI) - abs (x - y). Der Wert des kleinsten der beiden Winkel ist also:
Dies gibt Ihnen den absoluten Wert des Winkels und setzt voraus, dass die Eingänge normalisiert sind (dh innerhalb des Bereichs
[0, 2π)
).Wenn Sie das Vorzeichen (dh die Richtung) des Winkels beibehalten und auch Winkel außerhalb des Bereichs akzeptieren möchten, können
[0, 2π)
Sie das Obige verallgemeinern. Hier ist Python-Code für die verallgemeinerte Version:Beachten Sie, dass sich der
%
Operator nicht in allen Sprachen gleich verhält, insbesondere wenn negative Werte betroffen sind. Wenn also eine Portierung vorgenommen wird, sind möglicherweise einige Vorzeichenanpassungen erforderlich.quelle
from math import tau
.Ich stelle mich der Herausforderung, die unterschriebene Antwort zu geben:
quelle
Für UnityEngine-Benutzer besteht die einfache Möglichkeit darin, nur Mathf.DeltaAngle zu verwenden .
quelle
Arithmetische (im Gegensatz zu algorithmischen) Lösung:
quelle
Ein effizienter Code in C ++, der für jeden Winkel und sowohl für Bogenmaß als auch für Grad funktioniert, lautet:
quelle
Trigonometrische Funktionen müssen nicht berechnet werden. Der einfache Code in C-Sprache lautet:
sei dif = a - b im Bogenmaß
sei dif = a - b in Grad
Keine Sünde, kein Cos, keine Bräune, ... nur Geometrie !!!!
quelle
arg = arg - PIV2;
erweitertarg = arg - M_PI + M_PI
und führt zu nichts.