3 回答
TA贡献1812条经验 获得超5个赞
假设您要将范围缩放[min,max]到[a,b]。您正在寻找满足的(连续)功能
f(min) = a
f(max) = b
在你的情况下,a将是1,b将是30,但让我们从更简单的东西开始,并尝试映射[min,max]到范围[0,1]。
把min成函数获得了0可以与实现
f(x) = x - min ===> f(min) = min - min = 0
这几乎就是我们想要的。但是当我们真正想要时,投入max会给我们max - min1.所以我们必须扩展它:
x - min max - min
f(x) = --------- ===> f(min) = 0; f(max) = --------- = 1
max - min max - min
这就是我们想要的。所以我们需要进行翻译和缩放。现在,如果不是我们想要得到的任意值a和b,我们需要一些更复杂的:
(b-a)(x - min)
f(x) = -------------- + a
max - min
您可以验证投入min对x现在给a,并把在max给b。
您可能还会注意到,这(b-a)/(max-min)是新范围大小与原始范围大小之间的缩放系数。因此,其实我们是第一平移x通过-min,它扩展到了正确的因素,然后再翻译回最多的新的最小值a。
希望这可以帮助。
TA贡献1799条经验 获得超6个赞
这里有一些用于复制粘贴的JavaScript(这是烦人的答案):
function scaleBetween(unscaledNum, minAllowed, maxAllowed, min, max) {
return (maxAllowed - minAllowed) * (unscaledNum - min) / (max - min) + minAllowed;
}
像这样应用,将范围10-50缩放到0-100之间的范围。
var unscaledNums = [10, 13, 25, 28, 43, 50];
var maxRange = Math.max.apply(Math, unscaledNums);
var minRange = Math.min.apply(Math, unscaledNums);
for (var i = 0; i < unscaledNums.length; i++) {
var unscaled = unscaledNums[i];
var scaled = scaleBetween(unscaled, 0, 100, minRange, maxRange);
console.log(scaled.toFixed(2));
}
0.00,18.37,48.98,55.10,85.71,100.00
编辑:
我知道我很久以前就回答了这个问题,但是我现在使用的是一个更清洁的功能:
Array.prototype.scaleBetween = function(scaledMin, scaledMax) {
var max = Math.max.apply(Math, this);
var min = Math.min.apply(Math, this);
return this.map(num => (scaledMax-scaledMin)*(num-min)/(max-min)+scaledMin);
}
应用如下:
[-4, 0, 5, 6, 9].scaleBetween(0, 100);
[0,30.76923076923077,69.23076923076923,76.92307692307692,100]
TA贡献1802条经验 获得超5个赞
为方便起见,这里是Java形式的Irritate算法。根据需要添加错误检查,异常处理和调整。
public class Algorithms {
public static double scale(final double valueIn, final double baseMin, final double baseMax, final double limitMin, final double limitMax) {
return ((limitMax - limitMin) * (valueIn - baseMin) / (baseMax - baseMin)) + limitMin;
}
}
测试:
final double baseMin = 0.0;
final double baseMax = 360.0;
final double limitMin = 90.0;
final double limitMax = 270.0;
double valueIn = 0;
System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));
valueIn = 360;
System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));
valueIn = 180;
System.out.println(Algorithms.scale(valueIn, baseMin, baseMax, limitMin, limitMax));
90.0
270.0
180.0
添加回答
举报