2013-01-08 25 views
12

我记得使用一个方程来做到这一点 - 你怎么在Javascript中做到这一点?两个数字范围之间的缩放

插件2号的范围:

rangeX = 1 (through) 10; 
rangeY = 300.77 (through) 559.22; 

输入在rangeY刻度值:

inputY = 328.17; 

转换为成比例的值在rangeX规模:

outputX = 1.43; 

回答

20

使用百分比:

xMax = 10; 
xMin = 1; 

yMax = 559.22; 
yMin = 300.77; 

percent = (inputY - yMin)/(yMax - yMin); 
outputX = percent * (xMax - xMin) + xMin; 
0

对数学没有保证,但是我觉得是这样的:

var xLow = 1; 
var xHigh = 10: 
var yLow = 300.77; 
var yHigh = 559.22; 

var inputY = 328.17; 
var ouputX = xLow; 

var scaleYOverX = (yHigh - yLow)/(xHigh - xLow); 

if(inputY >= yLow && inputY <= yHigh) { 
    outputX = (inputY - yLow)/scaleYOverX + xLow; 
    alert(outputX); 
} else { 
    alert("Invalid input for Y scale"); 
} 
17
function convertRange(value, r1, r2) { 
    return (value - r1[ 0 ]) * (r2[ 1 ] - r2[ 0 ])/(r1[ 1 ] - r1[ 0 ]) + r2[ 0 ]; 
} 

convertRange(328.17, [ 300.77, 559.22 ], [ 1, 10 ]); 

>>> 1.9541497388276272 
+0

感谢您对这个方便功能! – SeinopSys

+0

我喜欢这种简单。谢谢! –

0

斯威夫特3 随着布尔扩展范围或不

func translate(input : Float, inputMin: Float, inputMax: Float, outputMin: Float, outputMax: Float, extendRange: Bool? = false, log: Bool? = false) -> Float { 

    //The actual translation function 
    func translationResult(_ inputMinA: Float, _ inputMaxA: Float) -> Float { 
     let myResult = outputMin + (outputMax - outputMin) * (input - inputMinA)/(inputMaxA - inputMinA) 
     return myResult 
    } 

    // extendRange true means it'll return a value outside the range of inputMin and inputMax but still follow the ratio 
    if extendRange! { 
     return result = translationResult(inputMin, inputMax) 

     if log! == true && input > inputMax || input < inputMin{ 
      print("outside range!") 
     } 
    } else { 
     //Doesn't let value go outside range 
     let inputMinA = min(inputMin, input) 
     let inputMaxA = max(inputMax, input) 

     return result = translationResult(inputMinA, inputMaxA) 
    } 
    } 


    translate(input: 50, inputMin: 100, inputMax: 1000.0, outputMin: 1, outputMax: 10, extendRange: false) => 1 
    translate(input: 50, inputMin: 100, inputMax: 1000.0, outputMin: 1, outputMax: 10, extendRange: true) => 0.5