示例范围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;
}
但就是这样:(
答案 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
一般来说,想法是你要重新定义范围(确保它们都从零开始),然后找到你需要如何拉伸第一个范围以获得第二个范围。所以步骤将是
[0-440]
,将第一个范围转换为40
,将第二个范围转换为[0-130]
。这样做是为了获得从零开始的间隔,这些间隔很容易扩展。10
中的任何值转换为[0-440]
的相应值,您需要将其与[0-130]
相乘。您可以将此想象为将第一个间隔缩小到130/440
间隔,然后除以[0-1]
,然后通过乘以将其拉伸到440
间隔。[0-130]
转到[0-440]
,这意味着从[0-130]
转到[40-440]
您首先需要减去{{1} }乘以[10-140]
然后添加40
示例:
130/440