【发布时间】:2017-02-08 03:56:25
【问题描述】:
我正在尝试创建一个函数,该函数接受一个数字并将其从 0 到 1 标准化,介于其最小和最大范围之间。例如:
如果我想在 5 到 15 之间标准化 10 的值,我称之为:
val = 10; normalize(val, 5, 15); 返回 0.5
在 -10 和 5 之间标准化一个值 0
val = 0; normalize(val, -10, 5); 返回 0.666
这是我想出的功能:
function normalize(val, min, max){
// Shift to positive to avoid issues when crossing the 0 line
if(min < 0){
max += 0 - min;
val += 0 - min;
min = 0;
}
// Shift values from 0 - max
val = val - min;
max = max - min;
return Math.max(0, Math.min(1, val / max));
}
我的问题是:这是标准化一维值的最有效方法吗?我将以 60fps 每帧调用这个函数几千次,所以我希望尽可能优化它以减少计算负担。我一直在寻找归一化公式,但我找到的都是 2 维或 3 维解决方案。
【问题讨论】:
-
我看不出你为什么要单独处理负分钟数,
-
数组的最小值和最大值是否始终相同?
-
@redneb 哇,你是对的!我是在没有真正测试的情况下先发制人地这样做的。它可以在不切换到 > 0 的情况下工作
-
@NinaScholz min 和 max 会根据我调用它的位置而改变。有时是
-100, 0,有时是-3, 781,等等。 -
@MarcoDelValle 所以只要去掉负最小值的特殊处理就可以了。
标签: javascript performance math normalization