2010-11-20 21 views
4

私は0.0から360.0の範囲に回転を制限するために、この機能を持っている:どの範囲に数を制限する

private float ClampRotation(float rotation) { 

    while(rotation < 0.0f) rotation += 360.0f; 
    while(rotation >= 360.0f) rotation -= 360.0f; 

    return rotation; 

} 

この機能は素晴らしい作品と、それはおそらく、より効率的であることが、私はできません同じことをすることができるネイティブJava関数があるかどうか疑問に思っていますか?

最も近いのはMath.min/maxですが、このようには動作しません。 -10.0の回転は、350.0を出力するはずであり、min/maxが行うように0.0ではありません。

+0

これは確かに最も効率的なソリューションではありません。数字が大きいほど、ループが長くなります。 – tdammers

+0

"効率的ではありません"ということは、@ Paulの答えが証明するように、回転の大きな値に対して非常に効率的になります。 –

答えて

4

%(モジュラス)のでrotation % 360.0fを使用する浮動小数点値で動作します(あなたが負の数に後から360.0を追加する必要があります)

+0

モジュラス演算子は、2つの数値が均等に割り切れるかどうかをチェックするだけです... OPの質問にどのように役立つか分かりません。 –

+3

@willell:実際には、一方の数値を他方の数値で割ったときに*剰余*を返します。これがゼロのときは、割り切れます。 – SimonJ

3

それだけで数学です..あなたはこのようにそれを行うことができます。

private float ClampRotation(float rotation) { 

    return rotation+360.0f*Math.ceil(-rotation/360.0f); 

} 

私はそれが大丈夫だと確信しています。

+2

私はちょうど '%'演算子を考案したと思う; – SimonJ

+0

これは実際には反対である(360度に何回回転しているかを見つけるモジュロは余りを見つける) (btw - 何らかの理由で私はこれを好む。) – RoeeK

+0

いいえ、これはモジュロの "floored division"の変形です(http://en.wikipedia.org/wiki/Modulo_operationを参照)。何も間違っていない - それはクヌスのために働いた! – SimonJ

4

モジュラス演算子を使用して、0より小さい値を考慮します。

private float ClampRotation(float rotation) { 

    rotation = rotation % 360f; 

    if (rotation < 0f) rotation += 360f; 

    return rotation; 

} 
1

伝統的なラッピング角度の実装は、希望の範囲から離れています。

モジュラスは浮動小数点のために少し奇妙です - それは負のために負を返します、従ってあなたはまだブランチを持っていなければなりません、そして、それはいくつかのマシンで遅くなる(私はマシンを見つけませんでしたここで、%は、2回または3回の減算の2回でループを回るよりもかなり安い)。

値が-1000〜+ 1000の範囲内にある場合は、バージョンがより明確で高速になります。あなたの値がそれよりも広い場合は、モジュラスベースのバージョンを探してください。非常に重要な場合は、使用する値の範囲でハードウェアをテストしてください。

関連する問題