2024-04-25 12:08:28 发布
网友
事实上,有些情况下上述答案会被打破。 例如错误输入值、错误输入范围、负输入/输出范围。
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
这是一个简单的线性转换。
new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min
因此,将-16000到16000之间的10000转换为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
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 }
注意,在这种情况下,我们被迫任意选择一个可能的新范围值。根据上下文的不同,合理的选择可以是:NewMin(参见示例)、NewMax或(NewMin + NewMax) / 2
NewMin
NewMax
(NewMin + NewMax) / 2
事实上,有些情况下上述答案会被打破。 例如错误输入值、错误输入范围、负输入/输出范围。
这是一个简单的线性转换。
因此,将-16000到16000之间的10000转换为0到100之间的新比例会产生:
或者更具可读性:
或者如果您想保护旧范围为0的情况(OldMin=OldMax):
注意,在这种情况下,我们被迫任意选择一个可能的新范围值。根据上下文的不同,合理的选择可以是:
NewMin
(参见示例)、NewMax
或(NewMin + NewMax) / 2
相关问题 更多 >
编程相关推荐