这是我第一次为我的任何项目制作算法。我有一个 Xbox 控制器,我将在 Python 脚本中使用 Pygame 来读取控制器的输出。Pygame 在居中时输出 0,在全左时输出 -1,在全右时输出 1。对于我的应用程序,我需要将其转换为 1000 到 2000 之间的值,其中 1000 为 -1,1500 为 0,2000 为 1。不一定要求答案,只是对如何为自己制定算法提供一些帮助。
问问题
167 次
5 回答
3
如果这些是唯一可能的值,那么您可以创建一个 dict 将 Pygame 输出映射到您的值。
positionMap = {-1:1000,0:1500,1:2000}
newVal = positionMap[oldVal]
但是,如果中间值也是可能的,那么使用这个等式:
newVal = oldVal*500 + 1500
于 2013-08-20T13:36:05.137 回答
1
有很多方法可以做你所要求的。最简单的方法是使用直线的两点形式进行线性映射。您可能在代数中学到了这一点,但您可能已经忘记了,所以这里有一个复习: http: //www.mathsisfun.com/algebra/line-equation-2points.html。
在您的情况下,x 值是您给出的值(-1 .. 1),y 值是您想要的值(1000..2000)。
当然,如果你想改变控制器的感觉,你可以选择不使用线性函数。例如,当您接近控制器的限制时,您可能想要一些减慢速度的东西。
于 2013-08-20T13:36:07.023 回答
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
于 2013-08-20T13:38:14.580 回答
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
于 2013-08-20T13:55:16.840 回答
0
如果您也是 Python 新手,那么可能会喜欢使用 if/elif/else 语句,因为这对您来说可能更具可读性:
if in_value == -1:
out_value = 1000
elif in_value == 0:
out_value = 1500
else:
out_value = 2000
代码可以包装在函数中或内联使用。
于 2013-08-21T05:13:01.433 回答