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)
您可以使用此函数将一个范围转换为另一个范围(python)
def transfrom(x):
return (x - 40)*(130/440.0) + 10
Run Code Online (Sandbox Code Playgroud)
一般来说,这个想法是你想要重新设定范围(确保它们都从零开始),然后找到你需要如何拉伸第一个范围以获得第二个范围。所以步骤是
[0-440]通过减法将第一个范围转换为 ,通过减法40将第二个范围转换[0-130]为10。这样做是为了获得从零开始的易于缩放的间隔。[0-440]为对应的值 from[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
Run Code Online (Sandbox Code Playgroud)