2016-10-06 64 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