映射-1,0,1到1000,1500,2000

时间:2013-08-20 13:29:32

标签: python algorithm pygame

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

5 个答案:

答案 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

代码可以包含在函数中或在线使用。