C ++'map'数字范围

时间:2011-12-30 21:38:03

标签: c++ c

在C或C ++中,或者通常在数学上是否有更好的方法来映射数字的比率,同时保留或舍入数据?

  

采取以下示例

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

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

这里我想将一系列数字[0,30000]映射到值[0,255]

3 个答案:

答案 0 :(得分:7)

如果我理解正确的话,您可以使用简单的线性插值来完成它。它会像这样工作:

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

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

答案 1 :(得分:7)

乘以255然后除以30000.使用整数格式,可以保存两个范围限制的乘积,30000 * 255或765万。这避免了中间浮点值的精度问题。

答案 2 :(得分: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.