代码之家  ›  专栏  ›  技术社区  ›  Espen

如何将数字限制在一个范围内

  •  4
  • Espen  · 技术社区  · 14 年前

    我有这个函数可以将旋转限制在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。

    4 回复  |  直到 14 年前
        1
  •  4
  •   The Archetypal Paul    14 年前

    %(模数)对浮点值起作用,因此使用 rotation % 360.0f (负数后面需要加360.0)

        2
  •  4
  •   tvanfosson    14 年前

    使用模数运算符,然后计算小于0的值;

    private float ClampRotation( float rotation ) {
    
        rotation = rotation % 360f;
    
        if (rotation < 0f) rotation += 360f;
    
        return rotation;
    
    }
    
        3
  •  3
  •   RoeeK    14 年前

    只是数学。。你可以这样做:

    private float ClampRotation( float rotation ) {
    
        return rotation+360.0f*Math.ceil(-rotation/360.0f);
    
    }
    

    我很确定没事

        4
  •  1
  •   Pete Kirkham    14 年前

    你有一个传统的包装角度的实现,它小于一个数量级的期望范围。

    对于浮点来说,模有点奇怪——它返回负数表示负数,所以你仍然需要有一个分支,它涉及一个除法,这在某些机器上比较慢(比如我还没有找到一台机器,在这种机器上,%比用两到三次的减法循环要便宜得多)。

    如果您的值在-1000到+1000之间,那么您的版本会更清晰、更快。如果你的值比这个大,那就选择一个基于模数的版本。如果这非常重要,请使用要使用的值范围在硬件上测试这两个值。