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

Ale*_*lex 3 language-agnostic math range

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

[40 ... 480]
Run Code Online (Sandbox Code Playgroud)

范围1中的示例数字:

[42, 59.4, 78.18, 120.43, 416]
Run Code Online (Sandbox Code Playgroud)

示例范围2:

[10 .. 140]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

但就是这样:(

小智 10

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

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

样品用法:

transformRange(100, {max: 150, min: 50}, {max: 1, min: 0}); => 0.5
Run Code Online (Sandbox Code Playgroud)

  • 看来结果需要加上输出范围最小值?即:`return (value - r1.min) * scale + r2.min`。参见https://jsfiddle.net/afcu4tx0/1/ (5认同)

cyo*_*yon 5

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

def transfrom(x):
    return (x - 40)*(130/440.0) + 10
Run Code Online (Sandbox Code Playgroud)

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

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

例子:

>>> transform(40)
10.0
>>> transform(42)
10.590909090909092
>>> transform(220)
63.181818181818187
>>> transform(480)
140.0
Run Code Online (Sandbox Code Playgroud)