将数字从一个范围翻译到另一个范围

时间:2013-09-27 18:07:48

标签: math language-agnostic range

示例范围1(最小值和最大值):

[40 ... 480]

范围1中的示例数字:

[42, 59.4, 78.18, 120.43, 416]

示例范围2:

[10 .. 140]

如何将数字的值从范围1转换为第二范围内的值? 42应该相当于新范围中10到11之间的东西。

我正在使用PHP,但这更像是一个数学问题。

我知道如何将它们与第二个范围对齐:

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

但就是这样:(

2 个答案:

答案 0 :(得分:10)

你的意思是这样的,它会线性地缩放值以适应新的范围吗?

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

答案 1 :(得分:4)

您可以使用此函数(python)

将其中一个范围转换为另一个范围
def transfrom(x):
    return (x - 40)*(130/440.0) + 10

一般来说,想法是你要重新定义范围(确保它们都从零开始),然后找到你需要如何拉伸第一个范围以获得第二个范围。所以步骤将是

  1. 通过减去[0-440],将第一个范围转换为40,将第二个范围转换为[0-130]。这样做是为了获得从零开始的间隔,这些间隔很容易扩展。
  2. 要将10中的任何值转换为[0-440]的相应值,您需要将其与[0-130]相乘。您可以将此想象为将第一个间隔缩小到130/440间隔,然后除以[0-1],然后通过乘以将其拉伸到440间隔。
  3. 现在您知道如何从[0-130]转到[0-440],这意味着从[0-130]转到[40-440]您首先需要减去{{1} }乘以[10-140]然后添加40
  4. 示例:

    130/440