归一化从[0.5 - 1]到[0 - 1]

twe*_*ypi 27 c++ math normalize hlsl

我有点被困在这里,我想这有点像脑筋急转弯.如果我的数字在0.5到1之间,我怎样才能将其标准化为0到1?

感谢您的帮助,也许我只是有点慢,因为我已经连续24小时工作O_O

jas*_*son 65

其他人为你提供了公式,但没有为你提供工作.这是你如何解决这样的问题.您可能会发现这比知道答案更有价值.

要映射[0.5, 1][0, 1]我们将寻找表格的线性地图x -> ax + b.我们将要求将端点映射到端点,并保留该顺序.

方法一:端点被映射到端点和顺序被保存要求意味着0.5被映射到01映射到1

a * (0.5) + b = 0 (1)
a * 1 + b = 1     (2)
Run Code Online (Sandbox Code Playgroud)

这是线性方程的同时系统,并且可以通过乘以等式来解决(1)-2和添加方程(1)以方程(2).一旦这样做,我们获得b = -1并将其替换为等式,(2)我们得到了它a = 2.因此地图x -> 2x - 1将成功.

方法二:一条线的通过两个点的斜率(x1, y1)(x2, y2)

(y2 - y1) / (x2 - x1).
Run Code Online (Sandbox Code Playgroud)

在这里,我们将使用这些点(0.5, 0)(1, 1)满足端点映射到端点并且映射是保持顺序的要求.因此斜率是

m = (1 - 0) / (1 - 0.5) = 1 / 0.5 = 2.
Run Code Online (Sandbox Code Playgroud)

我们有(1, 1)一个点在线上,因此我们有一条线的方程的点斜率形式

y - 1 = 2 * (x - 1) = 2x - 2
Run Code Online (Sandbox Code Playgroud)

以便

y = 2x - 1.
Run Code Online (Sandbox Code Playgroud)

我们再次看到这x -> 2x - 1是一个可以解决问题的地图.


Bil*_*ard 31

减去0.5(给你一个0到0.5的新范围)然后乘以2.

double normalize( double x )
{
    // I'll leave range validation up to you
    return (x - 0.5) * 2;
}
Run Code Online (Sandbox Code Playgroud)


Too*_*the 24

添加另一个通用答案.

如果要将线性范围[A..B]映射到[C..D],可以应用以下步骤:

移动范围使下限为0.(从两个边界中减去A:

[A..B] -> [0..B-A]
Run Code Online (Sandbox Code Playgroud)

缩放范围,使其为[0..1].(除以上限):

[0..B-A] -> [0..1]
Run Code Online (Sandbox Code Playgroud)

缩放范围,使其具有新范围的长度,即DC.(乘以DC):

[0..1] ->  [0..D-C]
Run Code Online (Sandbox Code Playgroud)

移动范围使下限为C.(将C添加到边界):

[0..D-C] -> [C..D]
Run Code Online (Sandbox Code Playgroud)

将其与单个公式相结合,我们得到:

       (D-C)*(X-A)
X' =   -----------  + C
          (B-A)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你得到A = 0.5,B = 1,C = 0,D = 1:

       (X-0.5)
X' =   ------- = 2X-1
        (0.5)
Run Code Online (Sandbox Code Playgroud)

注意,如果你需要将很多X转换为X',你可以将公式更改为:

       (D-C)         C*B - A*D
X' =   ----- * X  +  ---------  
       (B-A)           (B-A)
Run Code Online (Sandbox Code Playgroud)

看一下非线性范围也很有趣.您可以采取相同的步骤,但需要额外的步骤将线性范围转换为非线性范围.


Gle*_*003 15

×2 - 1

应该做的伎俩

  • 这将是0,1或2. (3认同)
  • 这是我解决的解决方案的数学部分,而不是与语言相关的部分 (3认同)

mee*_*tar 14

Lazyweb回答:将值转换x来自[minimum..maximum][floor..ceil]:

一般情况:

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor
Run Code Online (Sandbox Code Playgroud)

要标准化为[0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum)
Run Code Online (Sandbox Code Playgroud)

标准化为[0..1]:

normalized_x = (x - minimum)/(maximum - minimum)
Run Code Online (Sandbox Code Playgroud)