【问题标题】:Logarithmic Mouse Movement对数鼠标移动
【发布时间】:2010-07-30 03:46:42
【问题描述】:

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

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

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

【问题讨论】:

  • 我猜你的意思是指数...
  • 不是吗? :) 指数意味着更高值的加速度。我认为他希望加速度处于刻度的下限,这意味着使用对数函数。
  • 他说“在勉强推动的时候真的很慢”......但并没有真的说明 log/exp 的差异。
  • 嗯,是的,你可能是对的 :)
  • 非常好的问题,赞成。可能会用到一些段落。

标签: java mouse logarithm


【解决方案1】:

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

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

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

【讨论】:

  • 在操纵杆居中时不会给出零运动!
  • 同意,可能需要单独检查。
  • 这正是我真正需要的,非常感谢。我想我什至没有意识到我在问什么。哈哈。但再次感谢你:)。
【解决方案2】:

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

我不确定鼠标速度值是快还是慢,但你可以这样做

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

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

【讨论】:

  • 或 4* 等。任何数字都会给您足够大的范围。
  • 当值为 0 - x^0 = 1 而不是 0 时,这会导致一些微小的移动
  • 真的。只需让它 value = Math.pow(speed, value) - 1 @cristobalito:你的答案是什么意思? Math.pow 不能只接受 2 个参数吗?
  • 我也使用了你的价值*2的想法,给了我很好的速度范围。非常感谢!
  • 不熟悉Java,但基本上你可以使用任何基础。
【解决方案3】:

类似:

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 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多