Normalisieren Sie die Ausrichtung zwischen 0 und 360
Arbeite ich an einem einfachen drehen routine, die normalisiert Objekte eine rotation zwischen 0 und 360 Grad. Mein C# code scheint zu funktionieren, aber ich bin nicht ganz glücklich mit ihm. Kann das jemand verbessern, der auf den code unten, so dass es ein bisschen mehr robust?
public void Rotate(int degrees)
{
this.orientation += degrees;
if (this.orientation < 0)
{
while (this.orientation < 0)
{
this.orientation += 360;
}
}
else if (this.orientation >= 360)
{
while (this.orientation >= 360)
{
this.orientation -= 360;
}
}
}
InformationsquelleAutor der Frage JuniorDeveloper | 2009-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden modulo-Arithmetik:
InformationsquelleAutor der Antwort tvanfosson
Dies ist eine, die normalisiert zu jedem Bereich.
Nützlich für die Normalisierung zwischen [-180,180], [0,180] oder [0,360].
( in C++)
Für ints
Also im Grunde das gleiche, aber ohne den Boden.
Die version, die ich persönlich benutze ist ein generischer, dass ein Werk für alle numerischen Typen und es verwendet auch eine neue Etage, die nichts tut, im Falle der integralen Typen.
InformationsquelleAutor der Antwort QBziZ
Kann dies vereinfacht werden zu den folgenden.
C# folgt den gleichen Regeln wie C und C++ und
i % 360
geben Sie einen Wert zwischen-359
und359
für jede beliebige ganze Zahl, dann die zweite Zeile ist um sicherzustellen, dass es in den Bereich 0 bis 359 inclusive.Wenn Sie wollte sein schiefes, man könnte Sie unten eine Zeile:
würde halten Sie es positiv, unter allen Bedingungen, aber das ist ein böse hack für das speichern einer Zeile code, so würde ich es nicht tun, aber ich wird erklären.
Vom
degrees % 360
erhalten Sie eine Zahl zwischen-359
und359
. Hinzufügen360
wird, ändern Sie die Auswahl, um zwischen1
und719
. Wennorientation
ist schon positiv, das hinzufügen dieser Garantie ist es immer noch, und der Letzte% 360
bringen es zurück zu dem Bereich0
durch359
.An einer nackten mindestenskönnte man den code vereinfachen, da die
if
s undwhile
s kombiniert werden können. Zum Beispiel, das Ergebnis der Bedingungen, die in diesen beiden Zeilen:ist immer das gleiche, daher müssen Sie nicht die umliegenden
if
.So, dass Sie tun könnten:
aber ich würde noch gehen für die Modul-version, da es vermeidet loops. Dies wird wichtig, wenn ein Benutzer 360,000,000,000 für die rotation (und Sie wird dies tun, glauben Sie mir) und dann müssen Sie nehmen ein frühes Mittagessen, während Ihr code schleift Weg 🙂
InformationsquelleAutor der Antwort paxdiablo
Ich irgendwie schnell verspottet Sie diese in AS3, aber sollte funktionieren (Sie müssen möglicherweise
+=
auf den Winkel)InformationsquelleAutor der Antwort enzuguri
Formel für die re-orienting kreisförmigen Werte ich.e zu halten Winkel zwischen 0 und 359 ist:
generalisierte Formel für die Verschiebung Winkel Orientierung:
in dem Wert der Verschiebung darstellen circular-shift-e.g ich möchte Werte in -179 bis 180, dann kann es wie folgt dargestellt werden:
angle + Math.ceil( (-Winkel-179) /360 ) * 360
InformationsquelleAutor der Antwort Saad Ahmed
Ich lieber vermeiden, Schleifen, Bedingungen, beliebigen offsets (3600), und
Math.____()
Aufrufe:InformationsquelleAutor der Antwort Ronnie Overby
Fügen Sie ein beliebiges Vielfaches von 360 Grad, zwischen denen Ihre möglichen Eingabewerte werden könnte (um es über null), und nehmen Sie die restlichen mit %, wie dies
Obigen Fall nehmen können input-Winkel nach unten zu -3600. Sie können eine beliebige Zahl (Vielfaches von 360) wahnsinnig hoch ist, dass der input-Wert positiv.
In der Regel während einer animation, Ihre vorherigen frame/step-Wert würde wahrscheinlich bereits normalisiert durch den vorherigen Schritt, so werden Sie gut zu gehen, indem Sie nur 360:
InformationsquelleAutor der Antwort sergio