【问题标题】:Translate numbers from a range to another range将数字从一个范围翻译到另一个范围
【发布时间】:2013-09-27 18:07:48
【问题描述】:

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

但就是这样:(

【问题讨论】:

    标签: math language-agnostic range


    【解决方案1】:

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

    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
    

    【讨论】:

    • 最佳答案。容易理解。
    • 似乎需要在结果中添加输出范围最小值?即:return (value - r1.min) * scale + r2.min。见jsfiddle.net/afcu4tx0/1
    【解决方案2】:

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

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

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

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      相关资源
      最近更新 更多