这是我第一次为我的任何项目制作算法。 我有一个Xbox控制器,我将在Python脚本中使用Pygame来读取控制器的输出。 Pygame在居中时输出0,在完全左边时输出-1,在右边时输出1。 对于我的应用程序,我需要将其转换为1000到2000之间的值,其中1000是-1,1500是0,2000是1。 不一定要求答案,只是帮助我如何为自己制作算法。
答案 0 :(得分:3)
如果这些是唯一可能的值,那么您可以创建一个dict来将Pygame输出映射到您的值。
positionMap = {-1:1000,0:1500,1:2000}
newVal = positionMap[oldVal]
但是,如果中间值也可以,那么使用这个等式:
newVal = oldVal*500 + 1500
答案 1 :(得分:1)
有很多方法可以做你所要求的。最简单的方法是使用线的两点形式进行线性映射。你可能在代数中学到了这一点,但你可能已经忘记了它,所以这里有一个复习:http://www.mathsisfun.com/algebra/line-equation-2points.html。
在您的情况下,x值是您给出的值(-1 .. 1),y值是您想要的值(1000..2000)。
当然,如果您想改变控制器的感觉,可以选择不使用线性功能。例如,当你接近控制器的极限时,你可能想要一些减速的东西。
答案 2 :(得分:1)
您的功能可以是f(x) = ax^2 + bx + c
。将您的转换放入系统并解决它:
a(-1)^2 + b(-1) + c = 1000
a*0^2 + b*0 + c = 1500
a*1^2 + b*1 + c = 2000
a - b + c = 1000
c = 1500
a + b + c = 2000
a - b = -500
a + b = 500
=> 2a = 0 => a = 0
=> b = 500
所以你可以使用函数f(x) = 500x + 1500
。
f(-1) = 1000
f(0) = 1500
f(1) = 2000
f(0.3) = 1650
答案 3 :(得分:0)
def mapInput(value):
minInput = -1
maxInput = 1
minOutput = 1000
maxOutput = 2000
return (value - minInput)*(maxOutput-minOutput)/(maxInput-minInput) + minOutput
如果这些值永远不会改变,那么您可以节省几个处理器周期,然后执行:
def mapInput(value):
return value * 500 + 1500
答案 4 :(得分:0)
如果您也是Python的新手,那么可能想使用if / elif / else语句,因为这可能对您更具可读性:
if in_value == -1:
out_value = 1000
elif in_value == 0:
out_value = 1500
else:
out_value = 2000
代码可以包含在函数中或在线使用。