如何将数字从一个最小\最大集转换为另一个最小\最大集?[关闭]


19

我正在生成地形,并且我有一个perlin库,该库为我提供-1和+1之间的随机数。我想将其转换为0-255的比例。正确的方法是什么?

Answers:


23

基本公式为:

Result := ((Input - InputLow) / (InputHigh - InputLow))
          * (OutputHigh - OutputLow) + OutputLow;

您的情况:

结果:=((输入 - -1)/(1 - -1)*(255 - 0)+ 0 ;

如果系数是静态的,则可以从此处优化转换,但是编译器也可能会自己完成转换。

结果:=((输入 - -1)/ 2)* 255 + 0 ;

结果:= 输入 * 127.5 + 127.5 ;


2
这个答案对我的程序员的大脑最有意义。:)对其他所有人的出色回答表示“感谢”。
Thraka 2012年

10

范围-11为的总范围2。因此,您需要适当缩放它才能达到255。像这样:

(randomPerlin + 1.0) * 127.5

因此,您首先要添加10..2然后乘以127.5得到一个范围0..255


3

通过缩放和偏见的力量。

从您的值中减去范围的最小值。这将为您提供[0..2]范围内的值。

将其除以源范围的宽度,即可得到[0..1]范围内的值。

将该值乘以目标范围的宽度,即可得到[0..255]范围内的值。

添加目标范围的底数以获得目标范围内的值,在这种情况下,该值与上一步相同。

综上所述:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin

希望这可以帮助。


2

转换输入范围,以便通过加1(最小输入的负值)-1 .. 1-> 0 .. 2将最小值变为零。

由于输出范围从零开始,因此无需执行任何操作。

缩放新的输入范围,使其适合输出范围,这很容易,因为它们现在都从零开始:将值乘以255/2 0..2 * 2/255-> 0..255

做完了!

例:

0.5将变为((0.5 +1)* 127.5 = 191.25 -0.5将变为:(-0.5 +1)* 127.5 = 63.75


2

可以说x是原始输入,y是预期输出。我们至少有两个点 (x,y)(-1,0)(1,255)

由于我们要进行线性插值,因此我们可以查看形式方程 y = m*x + c

有了以上两点,我们可以解决mc 一旦做到这一点,你得到的变换方程。

请注意,此方法也适用于其他类型的方程式。例如,如果要指数或二次插值。


在我们的领域中,线性插值的一般含义往往是您在两个数量之间使用混合因子进行线性混合,如下所示:v = (1-a)*x + (a)*y。我看不出这个答案与所问的问题有多大关系,因为他想要的只是一个范围映射。
拉尔斯·维克伦德

事物是平面中的两个点唯一定义一条线。我们可以将范围映射视为直线。我们知道那条线上的两点。解决它会给出线方程。可能是线性插值在这里不是正确的词,但我想表示这条线上这两个点之间的一组内部点。
安库什2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.