atan2(y, x)
hat diese Diskontinuität bei 180 °, wo sie im Uhrzeigersinn auf -180 ° ..0 ° umschaltet.
Wie ordne ich den Wertebereich 0 ° ..360 ° zu?
Hier ist mein Code:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Ich Berechnung der Richtung eines streichBerührungsEreignis angesichts der startPoint
und endPoint
beide XY Punkt structs. Der Code ist für das iPhone, aber jede Sprache, die atan2f()
dies unterstützt , reicht aus.
Antworten:
quelle
(x >= 0 ? x : (2*PI + x)) * 180/PI
wie in(x < 0 ? 2*PI + x : x) * 180/PI
Lösung mit Modulo
Eine einfache Lösung, die alle Fälle erfasst.
Erläuterung
Positiv: 1 bis 180
Wenn Sie eine positive Zahl zwischen 1 und 180 mal 360 modifizieren, erhalten Sie genau die gleiche Zahl, die Sie eingegeben haben. Mod hier stellt nur sicher, dass diese positiven Zahlen als der gleiche Wert zurückgegeben werden.
Negativ: -180 bis -1
Wenn Sie hier mod verwenden, werden Werte im Bereich von 180 bis 359 Grad zurückgegeben.
Sonderfälle: 0 und 360
Die Verwendung von mod bedeutet, dass 0 zurückgegeben wird, was dies zu einer sicheren Lösung von 0-359 Grad macht.
quelle
-1 % 360 = -1
Fügen Sie einfach 360 ° hinzu, wenn die Antwort von atan2 weniger als 0 ° beträgt.
quelle
Oder wenn Sie keine Verzweigung mögen, negieren Sie einfach die beiden Parameter und fügen Sie der Antwort 180 ° hinzu.
(Wenn Sie dem Rückgabewert 180 ° hinzufügen, liegt er gut im Bereich von 0 bis 360, dreht aber den Winkel um. Wenn Sie beide Eingabeparameter negieren, wird er zurückgedreht.)
quelle
@erikkallen ist nah aber nicht ganz richtig.
Dies sollte in C ++ funktionieren: (Je nachdem, wie fmod implementiert ist, kann es schneller oder langsamer sein als der bedingte Ausdruck)
Alternativ können Sie dies tun:
da (x, y) und (-x, -y) sich in den Winkeln um 180 Grad unterscheiden.
quelle
Ich habe 2 Lösungen, die für alle Kombinationen von positivem und negativem x und y zu funktionieren scheinen.
1) Missbrauch atan2 ()
Gemäß den Dokumenten nimmt atan2 die Parameter y und x in dieser Reihenfolge. Wenn Sie sie jedoch umkehren, können Sie Folgendes tun:
2) Verwenden Sie atan2 () korrekt und konvertieren Sie anschließend
quelle
@Jason S: Ihre "fmod" -Variante funktioniert bei einer standardkonformen Implementierung nicht. Der C-Standard ist explizit und klar (7.12.10.1, "die fmod-Funktionen"):
so,
ist eigentlich nur eine ausführliche Umschreibung von:
Ihr dritter Vorschlag ist jedoch genau richtig.
quelle
Das mache ich normalerweise:
quelle
Ich habe eine Formel zum Ausrichten des Winkels in 0 bis 360 erstellt
quelle
Eine alternative Lösung besteht darin, die Funktion mod () zu verwenden, die wie folgt definiert ist:
function mod(a, b) {return a - Math.floor (a / b) * b;}
Dann wird mit der folgenden Funktion der Winkel zwischen den Punkten ini (x, y) und end (x, y) erhalten. Der Winkel wird in Grad ausgedrückt, die auf [0, 360] Grad normiert sind. und Nord mit 360 Grad.
quelle
Die Geosphäre des R-Pakets berechnet die PeilungRumb, eine konstante Peilungslinie bei gegebenem Ursprungspunkt und Ost / Nord. Die Ost- und Nordrichtung muss in einer Matrix oder einem Vektor liegen. Der Ursprungspunkt für eine Windrose ist 0,0. Der folgende Code scheint das Problem leicht zu beheben:
quelle
-1 ° wird (-1 + 360) = 359 °
-179 ° wird (-179 + 360) = 181 °
quelle
Math.PI
? Ist es das gleiche wieM_PI
?Dies gibt den Grad von 0 ° -360 ° gegen den Uhrzeigersinn zurück, 0 ° ist um 3 Uhr.
quelle
Eine Formel für den Wertebereich von 0 bis 360 Grad.
f (x, y) = 180-90 * (1 + Zeichen (x)) * (1 Zeichen (y ^ 2)) - 45 * (2 + Zeichen (x)) * Zeichen (y)
quelle
Hier ist etwas Javascript. Geben Sie einfach x- und y-Werte ein.
quelle