jas*_*son 65
其他人为你提供了公式,但没有为你提供工作.这是你如何解决这样的问题.您可能会发现这比知道答案更有价值.
要映射[0.5, 1]
到[0, 1]
我们将寻找表格的线性地图x -> ax + b
.我们将要求将端点映射到端点,并保留该顺序.
方法一:端点被映射到端点和顺序被保存要求意味着0.5
被映射到0
与1
映射到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)
看一下非线性范围也很有趣.您可以采取相同的步骤,但需要额外的步骤将线性范围转换为非线性范围.
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)