Python 地图-1,0,1到1000,1500,2000

Python 地图-1,0,1到1000,1500,2000,python,algorithm,pygame,Python,Algorithm,Pygame,这是我第一次为我的任何项目制作算法。 我有一个Xbox控制器,我将在Python脚本中使用Pygame来读取控制器的输出。Pygame居中时输出0,左满时输出1,右满时输出1。 对于我的应用程序,我需要将其转换为1000到2000之间的值,其中1000是-1,1500是0,2000是1。 不一定要问答案,只要帮我做一个算法就行了。如果这些是唯一可能的值,那么你可以创建一个dict,将Pygame输出映射到你的值 positionMap = {-1:1000,0:1500,1:2000} newV

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

如果这些是唯一可能的值,那么你可以创建一个dict,将Pygame输出映射到你的值

positionMap = {-1:1000,0:1500,1:2000}
newVal = positionMap[oldVal]
但是,如果中间值也是可能的,则使用以下等式:

newVal = oldVal*500 + 1500

如果这些是唯一可能的值,那么您可以创建一个dict来将Pygame输出映射到您的值

positionMap = {-1:1000,0:1500,1:2000}
newVal = positionMap[oldVal]
但是,如果中间值也是可能的,则使用以下等式:

newVal = oldVal*500 + 1500

有很多方法可以满足你的要求。最简单的方法是使用直线的两点形式进行线性映射。你可能是在代数中学的,但你可能已经忘记了,所以这里有一个复习:

在您的例子中,x值是给定的(-1..1),y值是您想要的(1000..2000)


当然,如果您想改变控制器的感觉,您可以选择不使用线性函数。例如,当你接近控制器的极限时,你可能需要一些速度减慢的东西。

有很多方法可以满足你的要求。最简单的方法是使用直线的两点形式进行线性映射。你可能是在代数中学的,但你可能已经忘记了,所以这里有一个复习:

在您的例子中,x值是给定的(-1..1),y值是您想要的(1000..2000)


当然,如果您想改变控制器的感觉,您可以选择不使用线性函数。例如,当接近控制器的极限时,您可能需要速度减慢的东西。

您的函数可以是
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

函数的形式可以是
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
如果这些值永远不会改变,那么您可以节省一些处理器周期,只需执行以下操作:

def mapInput(value):
    return value * 500 + 1500
如果这些值永远不会改变,那么您可以节省一些处理器周期,只需执行以下操作:

def mapInput(value):
    return value * 500 + 1500

如果您也是Python新手,那么可能希望使用If/elif/else语句,因为这可能更易于阅读:

if in_value == -1:
    out_value = 1000
elif in_value == 0:
    out_value = 1500
else:
    out_value = 2000

代码可以封装在函数中,也可以在线使用。

如果您也是Python新手,则可能希望使用If/elif/else语句,因为这样可能更易于阅读:

if in_value == -1:
    out_value = 1000
elif in_value == 0:
    out_value = 1500
else:
    out_value = 2000

代码可以封装在函数中,也可以在线使用。

为什么要使用二次函数来推导线性方程?假定的函数不应该是二次方程,因为这样就不会保持一对一的关系。确实,对于这种特殊的映射,不需要使用二次方程。我想我应该建议一些对其他映射也有效的东西,这样会更一般。它在这种情况下也可以工作,几乎不需要额外的工作。为什么要使用二次函数来推导线性方程?假定的函数不应该是二次方程,因为这样就不会保持一对一的关系。确实,对于这种特殊的映射,不需要使用二次函数。我想我应该建议一些对其他映射也有效的东西,这样会更一般。在这种情况下,它也能正常工作,只需要很少的额外工作。明显的
1500+500*n
有问题吗?明显的
1500+500*n
有问题吗?