2017-08-30 68 views
-1

例如,我有一个350度的角度,我想约束它的最大正偏移量为30,最大负偏移量为40.限制范围内的浮动角度的快速方法是什么?

因此,角度值应该是在(310,360)和(0,20)的范围内。如果计算出的角度值为304,则应将角度值约束为310,并且如果计算出的角度值为30,则应将角度值约束为20.

我已经实施了一种方法,但效率不高足够的(大部分努力是在角度值接近360〜0时解决问题)。什么是快速实现这个目标的方法?

功能:

// All values are in the range [0.0f, 360.0f] 
// Output: the angle value after constraint. 

float _KeepAngleValueBetween(float originalAngle, float currentAngle, float MaxPositiveOffset, float MaxNegativeOffset). 

例如:

KeepAngleValueBetween(350.0f, 302.0f, 30.0f, 40.0f) 

结果:310.0f

KeepAngleValueBetween(350.0f, 40.0f, 30.0f, 40.0f) 

结果:20.0f

KeepAngleValueBetween(140.0f, 190.0f, 45.0f, 40.0f) 

结果:185.0f

+1

安置自己的尝试。 –

+0

对不起,我不能。该代码也用于我公司的一个项目中。 @KlasLindbäck –

+0

你仍然需要提供更多细节。输入和预期输出的数据类型和范围。 –

回答

0

我无法想出一个不使用if的解决方案。无论如何,我通过在检查​​是否在所需范围内之前转换值来处理0/360左右的问题。

伪代码(好吧,这是C.它也是有效的Java和C++。):

float _KeepAngleValueBetween(float originalAngle, float currentAngle, float MaxPositiveOffset, float MaxNegativeOffset) { 

    // Translate so that the undesirable range starts at 0. 
    float translateBy = originalAngle + MaxPositiveOffset; 
    float result = currentAngle - translateBy + 720f; 
    result -= ((int)result/360) * 360; 

    float undesiredRange = 360f - MaxNegativeOffset - MaxPositiveOffset; 
    if (result >= undesiredRange) { 
     // No adjustment needed 
     return currentAngle; 
    } 

    // Perform adjustment 
    if (result * 2 < undesiredRange) { 
     // Return the upper limit because it is closer. 
     result = currentAngle + MaxPositiveOffset; 
    } else { 
     // Return the lower limit 
     result = currentAngle - MaxNegativeOffset + 360f; 
    } 

    // Translate to the range 0-360. 
    result -= ((int)result)/360 * 360; 

    return result; 
} 
相关问题