2013-11-04 339 views
1

我有一個應用程序監視多個數據點,我正在根據線性百分比fading between green, yellow and red執行着色。然而,這並不能準確地把問題看得出來,因爲數字越高,指數越差。範圍是0 - > 30000,我怎麼能產生我認爲會被稱爲對數百分比值而不是線性百分比值?計算對數百分比

回答

3

使用以下形式的函數。

F(X)= S B X/30000 +噸

我們知道,0應映射到0%和30000應該映射到100%。

F(0)= 0
F(30000)= 100

這些暗示方程以下系統。

S + T = 0
S B + T = 100

溶液(相對於b)是以下內容。

S = 100 /(B - 1)
噸= -100 /(B - 1)

選擇一個特定的B> 1倍的值(比如說B = 10)。然後你得到以下解決方案。

S =九分之百
噸= -100/9

即,函數f(x)是以下內容。

F(X)=(100 10 X/30000 - 100)/ 9

這裏你可以看到這個功能的一個情節:Wolfram Alpha

在C#中,這將類似於以下。

double x = ...; 

double b = 10.0; 
double s = 100.0/(b - 1); 
double t = -100.0/(b - 1); 

double f = s * Math.Pow(b, x/30000.0) + t; 
+0

當然這個圖是指數而不是對數。即它增長緩慢然後爆炸。而不是爆炸,然後慢慢增長到高峯。 –

+0

@伊萬沃伯頓我錯過了這一點?我在答案中哪裏說它是對數?這顯然是指數級的。:) –

+0

@Iwarburton哦 - 現在我明白了。爲什麼代碼使用'Math.Log'而不是'Math.Pow'?答案開始處的'f'定義使用指數。接得好。 –

5

我以「對數百分比」爲基礎假設您想將數據映射到範圍[0,100]的對數基礎上。你可以嘗試這樣的:

double Scale(int val) 
{ 
    if (val <= 1) 
     return 0; // log is undefined for 0, log(1) = 0 
    return 100 * Math.Log(val)/Math.Log(30000); 
} 
+0

這是正確的答案,如果你想繪製成倍增長的價值。 – besimple

0

提高對bmm6o的回答是:

public static double Scale(long value, long maxInputValue, long maxOutputValue) 
{ 
    if (value <= 1) 
     return 0; // log is undefined for 0, log(1) = 0 
    return maxOutputValue * Math.Log(value)/Math.Log(maxInputValue); 
} 

,如果你正在尋找線性和對數之間的事情,下面可能會有所幫助:

public static double Scale(long value, long maxInputValue, long maxOutputValue, double scaleFactor) 
{ 
    if (value <= 1) 
     return 0; // log is undefined for 0, log(1) = 0 
    return maxOutputValue * Math.Pow(Math.Log(value), scaleFactor)/Math.Pow(Math.Log(maxInputValue), scaleFactor); 
}