2013-09-27 186 views
3

實施例範圍1(最小值和最大值):翻譯從一個數字範圍到另一個範圍

[42, 59.4, 78.18, 120.43, 416] 

實施例範圍2:

[10 .. 140] 
從範圍1

[40 ... 480] 

實施例編號

如何將範圍1中的數值轉換爲第二範圍內的值? 42應該等同於新範圍內10到11之間的某個值。

我使用PHP,但這更像是一個數學問題。

我知道如何將它們對齊到第二範圍:

$diff = $range[0] - $numbers[0]; 
foreach($numbers as $i => $number){ 
    $numbers[$i] = $number + $diff; 
} 

但僅此而已:(

回答

3

您可以將範圍之一到另一個使用此功能(蟒蛇)

def transfrom(x): 
    return (x - 40)*(130/440.0) + 10 

一般的想法是,你要變基的範圍(確保它們都從零開始),然後找到您需要如何拉伸第一個範圍才能獲得第二個範圍。因此,步驟會

  1. 減去10減去40和第二範圍將第一個範圍[0-440][0-130]。這樣做是爲了獲得從零開始的易於縮放的區間。
  2. 若要將[0-440]的任何值轉換爲[0-130]的相應值,則需要將其與130/440相乘。你可以想象這是通過將440除以[0-1]間隔的第一個間隔,然後通過乘以將它延伸到[0-130]間隔。
  3. 現在你知道如何去從[0-440][0-130],這意味着,從[40-440][10-140]首先需要通過130/440減去40乘法變基,然後添加10

例子:

>>> transform(40) 
10.0 
>>> transform(42) 
10.590909090909092 
>>> transform(220) 
63.181818181818187 
>>> transform(480) 
140.0 
7

你的意思是這樣,這將縮放值線性以適應新的範圍之內?

var transformRange = (value, r1, r2) => { 
    var scale = (r2.max - r2.min)/(r1.max - r1.min) 
    return (value - r1.min) * scale; 
} 

使用範例:

transformRange(100, {max: 150, min: 50}, {max: 1, min: 0}); => 0.5 
+0

最佳答案。容易明白。 – adev

相關問題