2011-11-14 65 views
1

我從0 to 100一個float,我想它轉換成一個數-20 to 20一個例子:平移浮動到負或正

float100然後再翻譯這將是-20

float50然後翻譯它將是0

float0然後翻譯它將是20

這樣做的最好方法是什麼?

+0

如此多的答案,讓我覺得我現在沒有數學:( – Elgoog

+1

這是非常基本的數學;你應該刷新基本代數,如果你想成爲一個高效的開發者 –

回答

11

[我要去給你的方法來解決這個問題,而不僅僅是答案,因爲從長遠來看它會更有用。]

你需要一個線性變換形式y = mx + c,其中x是你輸入號碼,y是你的輸出數量和mc,你需要提前確定的時間常數。

要做到這一點,你需要解決以下聯立方程:

-20 = m * 100 + c 
+20 = m * 0 + c 

請注意,我拿起兩張您需要轉型的例子,並插入到方程式。我可以選擇任何兩個。

+0

+1的方法,這是肯定的最好方法。 – gkiar

+0

+1解釋它,並使我爲它工作:D – Elgoog

2

像這樣的東西應該做的:

20 - val * 0.4 
+0

你應該乘以0。4,而不是浮點除法。 –

+0

@Marcelo:這是真的 – x4u

1
float procent = (myval - 50)/2.5f; 

使用,如果你需要整數(int) floor(procent) ...

3

如何:(50. - x) * 0.4

0
((x/2.5)- 20) * -1 

這應該這樣做

0

你需要計算斜率。既然你已經有3分(0,20)(50,0)(100,20),你可以做dx = 40/100 = 2/5(y的變化/ x的變化)和b = -20。然後,你定義一個函數(F(X)= MX + B)F(X)=(2/5)* X - 20,0 < = X < = 100

1
float translate(float f) 
{ 
    return 20.0f - ((20.0f * f)/50.0f); 
} 
+0

爲什麼這是downvoted? –

+0

不知道。這有點奇怪。 – EricR

1

你想實現什麼被稱爲「線性插值」,可以在一般的功能就像這樣:

float linear_interpolate(float x, float x0, float x1, float y0, float y1) 
{ 
    return y0 + (x - x0)*((y1-y0)/(x1-x0)); 
} 

在你的情況,你會這樣稱呼它(與您的值替換x):

float value = linear_interpolate(x, 0.0f, 100.0f, -20.0f, 20.0f); 

http://en.wikipedia.org/wiki/Linear_interpolation爲參考文章。