Convert a number range to another range, maintaining ratio
NewValue = (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin
Or a little more readable:
OldRange = (OldMax - OldMin) NewRange = (NewMax - NewMin) NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
Or if you want to protect for the case where the old range is 0 (OldMin = OldMax):
OldRange = (OldMax - OldMin)if (OldRange == 0) NewValue = NewMinelse{ NewRange = (NewMax - NewMin) NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin}
Note that in this case we're forced to pick one of the possible new range values arbitrarily. Depending on context, sensible choices could be: NewMin
(see sample), NewMax
or (NewMin + NewMax) / 2
That's a simple linear conversion.
new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min
So converting 10000 on the scale of -16000 to 16000 to a new scale of 0 to 100 yields:
old_value = 10000old_min = -16000old_max = 16000new_min = 0new_max = 100new_value = ( ( 10000 - -16000 ) / (16000 - -16000) ) * (100 - 0) + 0 = 81.25
Actually there are some cases that above answers would break.Such as wrongly input value, wrongly input range, negative input/output ranges.
def remap( x, oMin, oMax, nMin, nMax ): #range check if oMin == oMax: print "Warning: Zero input range" return None if nMin == nMax: print "Warning: Zero output range" return None #check reversed input range reverseInput = False oldMin = min( oMin, oMax ) oldMax = max( oMin, oMax ) if not oldMin == oMin: reverseInput = True #check reversed output range reverseOutput = False newMin = min( nMin, nMax ) newMax = max( nMin, nMax ) if not newMin == nMin : reverseOutput = True portion = (x-oldMin)*(newMax-newMin)/(oldMax-oldMin) if reverseInput: portion = (oldMax-x)*(newMax-newMin)/(oldMax-oldMin) result = portion + newMin if reverseOutput: result = newMax - portion return result#test casesprint remap( 25.0, 0.0, 100.0, 1.0, -1.0 ), "==", 0.5print remap( 25.0, 100.0, -100.0, -1.0, 1.0 ), "==", -0.25print remap( -125.0, -100.0, -200.0, 1.0, -1.0 ), "==", 0.5print remap( -125.0, -200.0, -100.0, -1.0, 1.0 ), "==", 0.5#even when value is out of boundprint remap( -20.0, 0.0, 100.0, 0.0, 1.0 ), "==", -0.2