1

好吧,这可能是一个非常简单的问题。几年来我没有上过处理对数的数学课,所以我很抱歉。所以我有一个 USB 控制器,我用它来用左操纵杆控制屏幕上的鼠标。现在它的工作原理是控制器返回一个介于 0.00 和 1.00 之间的双精度值,具体取决于将操纵杆推向该方向的距离(0.00 中心,1.00 一直推到上面)。我使用它通过将返回值乘以给定速度(返回双倍 * 速度)来调整鼠标移动的速度。这给了我一个线性速度。但是为了鼠标的准确性和点击屏幕上的东西,我希望它更加对数,因为它在勉强推动时真的很慢,然后随着您将操纵杆移动得更远,速度会以对数方式增加。这样,您可以在屏幕上移动时获得良好的速度,同时在缓慢移动时也具有良好的灵敏度。所以我只需要公式的帮助,因为我确信它很简单。另外,我正在使用Java。现在我的公式是:

double value (value given by controller)
int speed = 25;
value += value * speed;

然后我用它来移动鼠标。谢谢,布雷登

4

3 回答 3

2

我想你的意思是指数。指数函数看起来像http://hotmath.com/images/gt/lessons/genericalg1/exponential_graph.gif:越多value,导数越大(speed对于相同的变化会增加更多value)。

double value = ...;
int base = 25;
value = java.lang.Math.pow(base, value);

不确定是否java.lang.Math需要完整形式或是否需要先导入java.lang.Math。我不是Java程序员。

于 2010-07-29T17:09:46.683 回答
1

我同意 MvanGeest,我认为你想要一个指数公式。这样它的距离很小,距离很大,距离很大。

我不确定鼠标速度值是快还是慢,但你可以做类似的事情

double value (value given by controller);
int speed (maximum speed value);
value = Math.pow(speed, value);

您还可以将值设为 2*(无论控制器为您提供什么),以实现更广泛的速度范围。

于 2010-07-29T17:11:07.930 回答
0

就像是:

f(value) = value * MAXSPEED * Math.Pow (base, 1 - value)

f(0) = 0 // no movement
f(1) = MAXSPEED // maximum movement when joystick is full throttle

所有值都应包含在该范围内。在这种情况下,基数可以是任何大于 1 的值。

于 2010-07-29T17:16:36.037 回答