2011-06-14 77 views
2

我有一個使用以下算法來從傳感器接收的值(無結合的範圍)轉換爲不同的值(結合區域)的設備驅動器。使用算法將未綁定值轉換爲綁定值?

傳感器的值通常爲0〜200範圍內的,但可以超過它,最大約爲4000(當您使用傳感器一種極端的方式這只是發生)。我基本上需要一個功能,可以做到以下,但沒有巨大的if,所以它更靈活。

它需要採取的值,步驟(在這種情況下20.0f)和最大輸出(在這種情況下10)。

/* disregard the floating point numbers, I can cast them to int */ 
if (value <= 20.0f) 
    return 0; 
else if (value <= 40.0f) 
    return 1; 
else if (value <= 60.0f) 
    return 2; 
else if (value <= 80.0f) 
    return 3; 
else if (value <= 100.0f) 
    return 4; 
else if (value <= 120.0f) 
    return 5; 
else if (value <= 140.0f) 
    return 6; 
else if (value <= 160.0f) 
    return 7; 
else if (value <= 180.0f) 
    return 8; 
else if (value <= 190.0f) 
    return 9; 
else if (value >= 200.0f) 
    return 10; 

return 0; 
+0

ok了,會發生什麼變化值的範圍在(190.0,200.0)? – ninjalj 2011-06-14 19:35:00

回答

4
int step(double value, int step, int maximum) { 
    return min(int(value/step), maximum); 
} 

編輯:作爲@DSM指出,這有一個柵欄柱錯誤的,應該是這樣的:

int step(double value, int step, int maximum) { 
    return min(int((value-1)/step), maximum); 
} 
+0

注意函數/公式可以是任何東西,所以你會像數學允許的那樣「靈活」。 – rubenvb 2011-06-14 19:14:30

+0

+1適用於一般解決方案。您也可以扔在一個最小參數,並做了最大(最小,最小(...)) – 2011-06-14 19:19:18

+0

幾乎可以肯定這並不重要,但是這給在轉換不同的答案:原來的功能在20.0爲0,階躍函數是1等和我不知道什麼打算值190 <值<200,但我假設他們是爲了給10] – DSM 2011-06-14 19:24:33

1

假如你有min,它看起來像你想

min(0, (int)((min(220, value) - 20)/20)) 

(編輯,比較遺憾的是較早的最小/最大困惑!)

1

我會做這樣的事情:

struct temp_thresholds {                                         
     float upper_bound;                                         
     int ret_val;                                          
} thresholds = {                                           
     { 20.0f,  0},                                         
     { 40.0f,  1},                                         
     { 80.0f,  2},                                         
     // ..                                            
     { 190.0f,  9},                                         
     { 200.0f,  0}, // strange, and doesn't quite match your code                             
     { MAX_FLOAT, 10}, // find a constant like this                                  
};                                               

int foo(float value)                                          
{                                               
     // if the table were big enough, you could do binary search                               
     for (int i = 0; i < sizeof thresholds/sizeof thresholds[0]; ++i)                             
       if (value <= thresholds[i].upper_bound)                                  
         return thresholds[i].ret_value;                                  
     assert(0);                                           
     return 0;                                           
}   
+0

嗯,考慮到相同的步長(我沒有仔細閱讀),那麼數學方法就更好了。 – 2011-06-14 19:57:16

+0

是啊,數學總是更好,直到有人讓需求變得更加隨心所欲;-) – phkahler 2011-06-14 20:24:33