将鼠标从一个点移动到另一个点的算法

时间:2012-01-06 22:18:44

标签: java algorithm math formula equation

我正在尝试制作一个小程序,将鼠标从当前位置移动到给定位置。这是一个我可以使用的方法,它将鼠标从一个点移动到另一个点,但没有动画:

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 个答案:

答案 0 :(得分:9)

你想要Bresenham's line algorithm。它通常用于在两个点之间绘制一条线,但是您不是绘制线条,而是沿着它移动鼠标。

Illustration of Bresenham's line algorithm

答案 1 :(得分:5)

以下是执行该操作的代码。此代码使用Bresenham Line Algo。如果你想看到没有锯齿状的线条,可以尝试http://en.wikipedia.org/wiki/Bresenham's_line_algorithm更多参考。{/ 3>

    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;
        }
    }

答案 2 :(得分:3)

您尝试解决的问题是线性插值问题,因为您有一个线性函数,即起点(x0,y0)和终点(x1,y1)之间的一条线。

幸运的是,解决方案很简单。维基百科的文章几乎准确地给出了你想要做的事情。

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

答案 3 :(得分:2)

你可以插入一条直线....基本上将y = mx + b拟合到给定的点。