Einfache Möglichkeit, Winkel zwischen -179 und 180 Grad zu halten
Gibt es eine einfache Möglichkeit zu konvertieren, die einen Winkel (in Grad) zwischen -179 und 180? Ich bin sicher, ich könnte mit mod (%) und einige if-Anweisungen, aber es wird hässlich:
//Make angle between 0 and 360
angle%=360;
//Make angle between -179 and 180
if (angle>180) angle-=360;
Es scheint nur, wie es sein sollte eine einfache mathematische operation, die nicht beide Aussagen gleichzeitig. Ich kann nur noch zum erstellen einer statischen Methode für die Konvertierung für jetzt.
Kommentar zu dem Problem - Öffnen
IMHO, Das ist nicht hässlich. Das ist ganz sauber und klar.
Was ist, wenn der Anfangswinkel weniger dann -179?
Nach Rücksprache mit den docs bin ich mit Matthew Whited - Winkel % 360 ergibt sich ein Wert zwischen -359 und +359, nicht 0 und +359. Damit Ihre Lösung scheitert zu normalisieren, erste Werte kleiner dann -179.
@Daniel: Guter Punkt. Das gegebene Beispiel ist nicht gut genug. Fühlen Sie sich frei, etwas zu deuten, das ist besser.
InformationsquelleAutor der Frage User1 | 2010-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein wenig spät zur party, ich weiß, aber...
Meisten dieser Antworten sind nicht gut, weil Sie versuchen, schlau zu sein und kurz und dann nicht aufpassen Grenzfälle.
Es ist ein wenig Ausführlicher, aber wenn Sie wollen, damit es funktioniert, einfach in der Logik zu machen, damit es funktioniert. Versuchen Sie nicht, clever zu sein.
Das funktioniert und ist einigermaßen sauber und einfach, ohne zu versuchen, zu fancy. Beachten Sie, dass nur null oder eins von den while-Schleifen können immer ausgeführt werden.
InformationsquelleAutor der Antwort Platinum Azure
InformationsquelleAutor der Antwort James K Polk
Versuchen, diese stattdessen!
atan2
hat eine Reihe von [-π, π). Dieser nutzt die Tatsache, dass tan θ = sin θ /cos θ, und dassatan2
ist intelligent genug, um zu wissen, welche Quadranten θ ist.Da möchte man Grad, werden Sie wollen, konvertieren Sie Ihre Winkel und Bogenmaß:
Update
Meine bisherigen Beispiel war auch vollkommen legitim, jedoch beschränkt sich der Bereich um ±90°.
atan2
's-Reihe ist der gewünschte Wert von -179° bis 180°. Erhalten Sie unten.Versuchen Sie dies:
Die domain
sin
ist die echte Linie, die Palette ist[-1, 1]
. Die domainasin
ist[-1, 1]
, und der Bereich ist[-PI/2, PI/2]
. Daasin
ist die inverse vonsin
Ihre Eingaben nicht geändert (viel, es gibt einige abdriften, denn Sie sind mit floating point-zahlen). So bekommen Sie Ihre eingegebenen Wert zurück, und Sie erhalten die gewünschte Bandbreite als ein Nebeneffekt von der eingeschränkten Reichweite der Arkussinus.Da möchte man Grad, werden Sie wollen, konvertieren Sie Ihre Winkel und Bogenmaß:
Werden(Vorsicht: Trigonometrische Funktionen sind bazillions mal langsamer als eine einfache dividieren und subtrahieren-Operationen, auch wenn Sie fertig sind, in eine FPU!)
InformationsquelleAutor der Antwort Seth
Nicht so schlau, auch, aber nicht wenn.Aber ich bin nicht sicher, wie Java-Griffe modulo für negative zahlen. Dies funktioniert nur, wenn -1 modulo 360 entspricht 359.UPDATE
Gerade überprüft die docs
a % b
ergibt sich ein Wert zwischen-(|b| - 1)
und+(|b| - 1)
daher der code ist fehlerhaft. Konto für negative Werte, die von der modulo-operator verwenden Sie den folgenden.Aber ... Nein ... nie ... etwas ähnlich zu deiner ersten Lösung, aber die festen Werte, die kleiner als -179.
InformationsquelleAutor der Antwort Daniel Brückner
Dieser funktioniert sowohl negative und Dezimalzahlen und erfordert keine Schleifen, noch trigonometrische Funktionen:
Winkel= Math.Stock(Winkel /360 + 0.5) * 360
Das Ergebnis ist in [-180, 180) Intervall. Für (-180, 180] Intervall, können Sie diese stattdessen zu verwenden:
Winkel= Math.ceil(Winkel /360 - 0.5) * 360
InformationsquelleAutor der Antwort Astronomino
Vielleicht nicht hilfreich, aber ich habe immer gerne mit nicht-Grad-Winkel.
Einem Winkel im Bereich von 0 bis 255 kann in Schranken gehalten werden bitweise Operationen, oder für eine einzelne byte-variable, einfache erlaubt zum überlaufen.
Einem Winkel Bereich von -128 bis 127 ist nicht ganz so einfach mit dem bitweisen ops, aber wieder, für ein single-byte-variable, Sie können lassen Sie es überlauf.
Dachte ich, es sei eine gute Idee, viele Jahre zurück für die Spiele, wo Sie sind wahrscheinlich über eine lookup-Tabelle für die Winkel. In diesen Tagen, nicht so gut - die Winkel sind unterschiedlich verwendet, und schwimmen sowieso.
Immer noch - vielleicht eine Erwähnung Wert.
InformationsquelleAutor der Antwort Steve314
Einen kurzen Weg, die Griffe negativen zahlen ist
Cast abschmecken.
BTW: Es scheint, dass die Winkel zwischen den (180.0, 181.0) sind nicht definiert. Sollte nicht der Bereich (-180, 180] (exklusive, inklusive]
InformationsquelleAutor der Antwort Peter Lawrey
Ich weiß, dass Jahre vergangen, aber noch immer.
Diese Lösung enthält keine Schleifen, kein Abzug, kein modulo (ermöglicht das normalisieren in Bogenmaß Intervall). Funktioniert für alle Eingaben, einschließlich negativer Werte, große Werte, Rand-Fällen.
InformationsquelleAutor der Antwort alexburtnik
Gut, eine weitere Lösung, diese mit nur einer division und keine Schleifen.
InformationsquelleAutor der Antwort Vlad
Hier ist ein integer-Lösung:
Manchmal wird klug macht einfach mehr Spaß, Platin Azure.
InformationsquelleAutor der Antwort Cory B
Ich habe eine Formel für die Ausrichtung der kreisförmigen Werte
halten Winkel zwischen 0 und 359 ist:
aber zu halten zwischen -179 bis 180 Formel kann sein:
dieser wird seine Orientierung shift über -179 halten tatsächlichen Winkel intakt
generalisierte Formel für die Verschiebung Winkel Orientierung:
InformationsquelleAutor der Antwort Saad Ahmed
InformationsquelleAutor der Antwort Matthew Whited
Wie etwa
Dies tatsächlich zurück, andere Ergebnisse erzielen als der naive Ansatz, vorgestellt in der Frage, aber es wird halten Sie den Winkel zwischen den Grenzen angegeben. (Ich nehme an, dass vielleicht dies die falsche Antwort, aber ich lasse es hier im Falle löst es andere Personen mit ähnlichen problem).
InformationsquelleAutor der Antwort
Hier ist mein Beitrag. Es scheint zu funktionieren für alle Winkel ohne Rand Probleme. Es ist schnell. Es kann n180[360000359] = -1 fast augenblicklich. Beachten Sie, wie die Sign-Funktion hilft bei der Auswahl der richtigen Logik Weg und ermöglicht den gleichen code in unterschiedlichen Winkeln.
Ratch
InformationsquelleAutor der Antwort Ratch
Es besser ist die Verwendung von Bibliothek-Funktionen. Sie behandeln Sonderfälle wie NaN und Ewigkeiten.
InformationsquelleAutor der Antwort cohadar