Math 将数字从一个范围转换到另一个范围

Math 将数字从一个范围转换到另一个范围,math,language-agnostic,range,Math,Language Agnostic,Range,示例范围1(最小值和最大值): 范围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] = $

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

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

但就是这样:(

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

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

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

一般来说,您希望重新设置范围的基础(确保它们都从零开始),然后找到如何拉伸第一个范围以获得第二个范围

  • 通过减去
    40
    将第一个范围转换为
    [0-440]
    ,通过减去
    10
    将第二个范围转换为
    [0-130]
    。这样做是为了得到从零开始的间隔,这很容易缩放
  • 要将
    [0-440]
    中的任何值转换为
    [0-130]
    中的相应值,您需要将其与
    130/440
    相乘。您可以将其想象为将第一个间隔缩小为
    [0-1]
    间隔,方法是用
    440
    除以,然后将其拉伸为
    [0-130]
    相乘间隔
  • 现在你知道如何从
    [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
    

    最佳答案。易于理解。似乎需要将输出范围最小值添加到结果中?即:
    返回(值-r1.min)*缩放+r2.min
    。请参阅
    def transfrom(x):
        return (x - 40)*(130/440.0) + 10
    
    >>> transform(40)
    10.0
    >>> transform(42)
    10.590909090909092
    >>> transform(220)
    63.181818181818187
    >>> transform(480)
    140.0