1

这是我第一次为我的任何项目制作算法。我有一个 Xbox 控制器,我将在 Python 脚本中使用 Pygame 来读取控制器的输出。Pygame 在居中时输出 0,在全左时输出 -1,在全右时输出 1。对于我的应用程序,我需要将其转换为 1000 到 2000 之间的值,其中 1000 为 -1,1500 为 0,2000 为 1。不一定要求答案,只是对如何为自己制定算法提供一些帮助。

4

5 回答 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 回答