2016-10-06 80 views
4

忍受我一分钟。根据输入增加或减少固定值的优雅方式

我有一个方法,应该增加或减少一个固定值,取决于给定的输入。

我知道我的最大值是1.0f,最小值是0.0f。固定值是0.1f

现在,如果输入值为1.0f,则方法应减去,直到值为0f。如果输入值为0f,则方法应添加0.1f,直到值为1.0f

所以对于0f1f工作方法是:

void Foo(float input) { 
    float step = .1f; 
    for (float i=0f; i<=1f; i += step) { 
     input = i; 
    } 
} 

很显然,我可以有一个if语句检查输入的值,但是有另一种方法一种方法内实现这一目标?我觉得我只是在这里错过了一个非常基本的算术操作。

+0

所以,你要定义一系列的'input'参数,以确保它的0f'和'1f'之间'? –

+3

你是否正在努力完成某些事情(例如,在Unity中从a到b的lerp),还是这是纯粹的学术活动? (一个有趣的问题,顺便说一句) –

+0

你想要优雅,还是你想效率? ;) –

回答

5

只是一个建议

我觉得一步可以调整基于初始值是正的还是负的,所以它运行的第一次,直到达到最终值使用一个做一段时间。

基于您的代码

void Foo(float input) { 
    float step = input == 0f ? .1f : -0.1f; 

    do 
    { 
     input = input + step 
    } while (input > 0f && input < 1.0f); 
} 
0

如果你想真正避免使用if语句在所有的步骤,实际上你可以直接从输入获得它。反过来,你可能会得到一些额外的数字错误,但是因为你已经使用了浮动,所以这可能不是你关心的问题。

void foo(float input) 
{ 
    float step = (.5f - input)/5.f; 
    do 
    { 
     input += step; 
    } while (input > 0.0f && input < 1.0f); 
} 

运行它在我的机器上给了我

foo(1.0f) --> -7.45058e-08 
foo(0.0f) --> 1 
+0

很好!这是我实际上在寻找的那种'黑客'。所以'.5f'只是我的'min'和'max'值的平均分数? – Soift

+0

@Soift在这种情况下,是的。如果你想有一个变量'max'和'min',我不确定它是否会那么简单(特别是如果你仍然想要一个恒定的步长) – pingul