“无损”浮动到BYTE转换

时间:2012-02-10 22:04:27

标签: c++ c math casting

我正在使用libnoise在1024x1024地形网格上生成Perlin噪音。我想将它的浮点输出转换为0到255之间的BYTE。问题最终是数学问题:如何将实际区间(-1,1)中的值转换为整数1(0,255)最小化损失吗

2 个答案:

答案 0 :(得分:5)

如果您的输入范围不包括端点,此公式将为您提供[0,255]中的数字:

(int)((x + 1.0) * (256.0 / 2.0))

如果要包含端点(然后通常写为[-1,1]而不是(-1,1)),则需要x == 1.0的特殊情况将其舍入为255。 / p>

答案 1 :(得分:0)

最好的方法可能取决于(-1,1)中浮子的分布;如果在某些区域中有更多的区域,而在某些区域则有更少的区域,您可能希望以后者为代价来提高前者的“精度”。基本上,如果你有一个概率函数用于在这个区间定义的输出,你可以将(0,1) - 概率值的区间 - 分成256个相等的子区间,并且对于每个给定的浮点数,你可以计算出哪个子区间其概率函数值下降。对于噪声,概率函数(或至少应该)接近线性,因此Mark Byers的答案可能就是这样。