Логарифмическое движение мыши

Хорошо, это, вероятно, будет довольно простой вопрос. У меня не было уроков математики, посвященных логарифмам, несколько лет, так что прошу прощения. Итак, у меня есть USB-контроллер, который я использую для управления мышью на экране с помощью левого джойстика. Теперь, как это работает прямо сейчас, контроллер возвращает двойное значение между 0,00 и 1,00 в зависимости от того, насколько далеко вы нажимаете джойстик в направлении (0,00 в центре, 1,00 нажато до упора). Я использую это, чтобы отрегулировать скорость движения мыши, умножая возвращаемое значение на заданную скорость (возвращенное двойное * скорость). Это дает мне линейную скорость. Но с целью точности мыши и щелчков по экрану я бы хотел, чтобы он был более логарифмическим, так как он очень медленный, когда едва нажимаешь, а затем скорость увеличивается логарифмически, когда вы перемещаете джойстик дальше. Таким образом, вы можете получить хорошую скорость для перемещения по экрану, а также иметь хорошую чувствительность при медленном перемещении. Так что мне просто нужна помощь с формулой, так как я уверен, что это довольно просто. Кроме того, я работаю на Java. Сейчас моя формула:

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

Затем я использую это для перемещения мыши. Спасибо, Брайден.


person Brayden    schedule 29.07.2010    source источник
comment
Я полагаю, вы имели в виду экспоненциальный...   -  person MvanGeest    schedule 29.07.2010
comment
Не совсем? :) Экспоненциальный подразумевал бы ускорение для более высоких значений. Я думаю, он хочет, чтобы ускорение было в нижней части шкалы, что означало бы использование логарифмической функции.   -  person cwap    schedule 29.07.2010
comment
Он говорит, что это очень медленно, когда едва нажимаешь... Однако на самом деле ничего не говорит о разнице между логом и опытом.   -  person MvanGeest    schedule 29.07.2010
comment
Хм, да, возможно, вы правы :)   -  person cwap    schedule 29.07.2010
comment
Действительно хороший вопрос, проголосовал. Вероятно, можно было бы использовать несколько абзацев.   -  person Eugene M    schedule 29.07.2010


Ответы (3)


Я полагаю, вы имели в виду экспоненциальный. Экспоненциальная функция выглядит так: 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-программист.

person MvanGeest    schedule 29.07.2010
comment
не дает нулевого движения при центрировании джойстика! - person cristobalito; 29.07.2010
comment
Согласен, возможно, это нужно проверить отдельно. - person MvanGeest; 29.07.2010
comment
Это было именно то, что мне было нужно на самом деле, большое спасибо. Кажется, я даже не понял, о чем прошу. Ха-ха. Но еще раз спасибо :). - person Brayden; 29.07.2010

Я согласен с MvanGeest, я думаю, вам нужна экспоненциальная формула. Таким образом, он маленький с небольшим расстоянием и очень большой с большими расстояниями.

Я не уверен, какие значения скорости мыши быстрые или медленные, но вы можете сделать что-то вроде

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

Вы также можете сделать значение, например, 2 * (независимо от того, что дает вам контроллер), чтобы расширить диапазон скоростей.

person Eric    schedule 29.07.2010
comment
или 4 * и т. д. любое число даст вам достаточно большой диапазон. - person Eric; 29.07.2010
comment
это вызывает небольшое движение, когда значение равно 0 - x ^ 0 = 1, а не 0 - person cristobalito; 29.07.2010
comment
истинный. просто сделайте его value = Math.pow(скорость, значение) - 1 @cristobalito: что вы имеете в виду в своем ответе? Разве Math.pow не может принимать только 2 аргумента? - person Eric; 29.07.2010
comment
Я также использовал вашу идею о значении * 2, что дало мне хороший диапазон скоростей. Большое спасибо! - person Brayden; 29.07.2010
comment
Не знаком с Java, но по сути вы можете использовать любую базу. - person cristobalito; 29.07.2010

Что-то типа:

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.

person cristobalito    schedule 29.07.2010