2011-12-30 36 views
2

在保存或舍入數據的同時映射數字比率還有C或C++中的更好的方法,還是一般的數學方法?C++'map'數字範圍

看看下面的例子

double cdp = 17000.0;  
float integ = 30000.0/255; 
int val = cdp/integ; 

color = color + RGB(val, val, val); 

在這裏,我想的數字範圍[0,30000]映射到的值[0,255]

+2

什麼是錯的方式給出的片段不是嗎? – Griwes 2011-12-30 21:40:43

+0

將問題從「好方法」改爲「更好的方式」 – grep 2011-12-30 21:44:45

回答

7

乘以255然後除以30000.使用整數格式可以保存兩個範圍限制的乘積,30000 * 255或765萬。這可以避免中間浮點值的精度問題。

+4

並且可能會添加偏差(偏移量),因爲整數除法捨去而不是舍入。例如'val =(cdp * 255 + 15000)/ 30000;' – 2011-12-30 21:51:41

6

可以使用一個簡單的線性插值來做到這一點,如果我理解正確。它會這樣工作:

x = inValue/(maxInRange - minInRange); 
result = minOutRange + (maxOutRange - minOutRange) * x 

其中inValue是您的示例中30,000的數字。 minInRange = 0,maxInRange = 30,000,minOutRange = 0,maxOutRange = 255。

2

如果你想四捨五入到最接近的價值,而不是截斷任何小數部分,那麼你必須這樣做:

double prod = cpd * 255; //double is big enough to hold the product without loss of precision 
val = (int)(prod/30000 + 0.5); //Adding 0.5 turns truncation into rounding.