在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]
答案 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.