5

示例范围 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;
}

但就是这样:(

4

2 回答 2

12

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

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
于 2013-09-27T18:16:46.150 回答
5

您可以使用此函数(python)将一个范围转换为另一个范围

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

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

  1. 通过减法将第一个范围转换为,[0-440]通过减法40将第二个范围转换[0-130]10。这样做是为了获得从零开始的易于缩放的间隔。
  2. 要将任何值从转换[0-440]为相应的值,[0-130]您需要将其乘以130/440[0-1]您可以将其想象为通过除以将第一个间隔缩小为一个间隔440,然后[0-130]通过乘以将其拉伸为一个间隔。
  3. 现在您知道如何从[0-440]to去[0-130],这意味着要从[40-440]to[10-140]您首先需要通过减去40乘以130/440然后添加来变基10

例子:

>>> transform(40)
10.0
>>> transform(42)
10.590909090909092
>>> transform(220)
63.181818181818187
>>> transform(480)
140.0
于 2013-09-27T18:17:22.550 回答