3 回答

TA貢獻1793條經(jīng)驗 獲得超6個贊
NewValue = (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin
或者更具可讀性:
OldRange = (OldMax - OldMin)
NewRange = (NewMax - NewMin)
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
或者,如果要保護舊范圍為0(OldMin = OldMax)的情況:
OldRange = (OldMax - OldMin)
if (OldRange == 0)
NewValue = NewMin
else
{
NewRange = (NewMax - NewMin)
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
}
請注意,在這種情況下,我們不得不隨意選擇一個可能的新范圍值。根據(jù)上下文,明智的選擇可能是:NewMin(見樣本),NewMax或(NewMin + NewMax) / 2

TA貢獻1829條經(jīng)驗 獲得超4個贊
這是一個簡單的線性轉(zhuǎn)換。
new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min
因此,在-16000到16000的范圍內(nèi)將10000轉(zhuǎn)換為0到100的新范圍,可以得到:
old_value = 10000
old_min = -16000
old_max = 16000
new_min = 0
new_max = 100
new_value = ( ( 10000 - -16000 ) / (16000 - -16000) ) * (100 - 0) + 0
= 81.25

TA貢獻1801條經(jīng)驗 獲得超8個贊
實際上有些情況下上面的答案會破裂。如錯誤的輸入值,錯誤的輸入范圍,負輸入/輸出范圍。
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 cases
print remap( 25.0, 0.0, 100.0, 1.0, -1.0 ), "==", 0.5
print remap( 25.0, 100.0, -100.0, -1.0, 1.0 ), "==", -0.25
print remap( -125.0, -100.0, -200.0, 1.0, -1.0 ), "==", 0.5
print remap( -125.0, -200.0, -100.0, -1.0, 1.0 ), "==", 0.5
#even when value is out of bound
print remap( -20.0, 0.0, 100.0, 0.0, 1.0 ), "==", -0.2
添加回答
舉報