3 回答

TA貢獻1812條經(jīng)驗 獲得超5個贊
假設您要將范圍縮放[min,max]到[a,b]。您正在尋找滿足的(連續(xù))功能
f(min) = a
f(max) = b
在你的情況下,a將是1,b將是30,但讓我們從更簡單的東西開始,并嘗試映射[min,max]到范圍[0,1]。
把min成函數(shù)獲得了0可以與實現(xiàn)
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
這就是我們想要的。所以我們需要進行翻譯和縮放。現(xiàn)在,如果不是我們想要得到的任意值a和b,我們需要一些更復雜的:
(b-a)(x - min)
f(x) = -------------- + a
max - min
您可以驗證投入min對x現(xiàn)在給a,并把在max給b。
您可能還會注意到,這(b-a)/(max-min)是新范圍大小與原始范圍大小之間的縮放系數(shù)。因此,其實我們是第一平移x通過-min,它擴展到了正確的因素,然后再翻譯回最多的新的最小值a。
希望這可以幫助。

TA貢獻1799條經(jīng)驗 獲得超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
編輯:
我知道我很久以前就回答了這個問題,但是我現(xiàn)在使用的是一個更清潔的功能:
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條經(jīng)驗 獲得超5個贊
為方便起見,這里是Java形式的Irritate算法。根據(jù)需要添加錯誤檢查,異常處理和調(diào)整。
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
添加回答
舉報