Алгоритм перемещения мыши из одной точки в другую по прямой - PullRequest
4 голосов
/ 07 января 2012

Я пытаюсь создать небольшую программу, которая переместит мышь из текущей позиции в данную.Вот метод, который я могу использовать, который будет перемещать мышь из одной точки в другую, но без анимации:

moveMouse(int x, int y);

Это переместит мышь из текущих координат в x, y на экране без анимации.Теперь моя задача - переместить мышь к этой координате, но она также должна показывать, как мышь движется по одному пикселю за раз.Мне нужно создать цикл, который перемещает курсор мыши на несколько пикселей x и y за один раз, так что вот о чем я думал:

public void moveMouseAnimation(x,y){
      //Integers x2 and y2 will be the current position of the mouse cursor
      boolean isRunning = true;
      while(isRunning){
           delay(10); // <- 10 Milliseconds pause so that people can see the animation
           x2 -= 1;
           y2 -= 1;
           moveMouse(x2,y2);
           if(x2 == x && y2 == y) isRunning = false; //Ends loop
      }
}

Теперь мне нужно найти правильные значения x2 и y2, чтобымышь движется по прямой линии и наконец достигает x и y.Может ли кто-нибудь мне помочь.

Ответы [ 4 ]

9 голосов
/ 07 января 2012

Вы хотите алгоритм линии Брезенхэма . Обычно он используется для рисования линии между двумя точками, но вы вместо рисования линии перемещаете мышь вдоль нее.

Illustration of Bresenham's line algorithm

5 голосов
/ 07 января 2012

Ниже приведен код для этого.Этот код использует Bresenham Line Algo.Чтобы узнать больше о soln, попробуйте http://en.wikipedia.org/wiki/Bresenham's_line_algorithm, если вам не нужны неровные линии

    boolean steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
    if (steep) {
        int t;
        // swap(x0, y0);
        t = x0;
        x0 = y0;
        y0 = t;
        // swap(x1, y1);
        t = x1;
        x1 = y1;
        y1 = t;
    }
    if (x0 > x1) {
        int t;
        // swap(x0, x1);
        t = x0;
        x0 = x1;
        x1 = t;

        // swap(y0, y1);
        t = y0;
        y0 = y1;
        y1 = t;
    }
    int deltax = x1 - x0;
    int deltay = Math.abs(y1 - y0);
    int error = deltax / 2;
    int ystep;
    int y = y0;
    if (y0 < y1)
        ystep = 1;
    else
        ystep = -1;

    for (int x = x0; x < x1; x++) {
        if (steep)
            moveMouse(y, x);
        else
            moveMouse(x, y);
        error = error - deltay;
        if (error < 0) {
            y = y + ystep;
            error = error + deltax;
        }
    }
3 голосов
/ 07 января 2012

Проблема, которую вы пытаетесь решить, заключается в линейной интерполяции, в которой у вас есть линейная функция - линия между начальной точкой (x0, y0) и конечной точкой (x1, y1).

К счастью, решение простое. В статье в Википедии приведены примеры практически того, что вы пытаетесь сделать.

http://en.wikipedia.org/wiki/Linear_interpolation

2 голосов
/ 07 января 2012

Вы можете интерполировать прямую линию .... в основном, подбирая y = mx + b к заданным точкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...