2012-08-26 17 views
9

Tôi đang làm việc trên một dự án về điều khiển từ xa, gửi conrdinate x và y của con trỏ từ máy khách đến máy chủ.Lớp Java Robot mô phỏng chuyển động của con người chuột

Nhưng

robot.mouseMove(x,y); 

sẽ chỉ di chuyển con trỏ đến điểm cụ thể mà không cần di chuyển các điểm con trỏ hình thức origional

Tôi có tìm algorthim này đơn giản để mô phỏng sự chuyển động liên tục của chuột

for (int i=0; i<100; i++){ 
    int x = ((end_x * i)/100) + (start_x*(100-i)/100); 
int y = ((end_y * i)/100) + (start_y*(100-i)/100); 
robot.mouseMove(x,y); 
} 

Nhưng thuật toán này vẫn còn quá đơn giản, nó chỉ di chuyển từ điểm này sang điểm khác chậm, mà vẫn không giống như hành vi của con người.

Tôi đã đọc một số mã soruce cởi mở về điều khiển từ xa từ web, và tôi tìm thấy dự án này http://code.google.com/p/java-remote-control/ đang sử dụng MosueMovement gọi phương thức từ lớp MouseListener, mà họ sử dụng để thực hiện các "kéo".

Tôi muốn biết là có ai biết cách tốt hơn để làm điều này không?

+1

bạn có thể muốn thu thập một số dữ liệu từ người dùng và sau đó sử dụng dữ liệu đó theo nhiều cách khác nhau để nhân rộng mô phỏng của con người. –

+0

Từ bài đăng của bạn có vẻ như khiếu nại chính của bạn là tốc độ di chuyển của chuột là sai. Nếu đó là vấn đề chính, sau đó bạn có thể điều chỉnh mã của bạn để làm cho con chuột di chuyển một tốc độ không đổi, và sau đó điều chỉnh tốc độ đó cho đến khi nó gần tối ưu. –

+1

Có thể bạn có thể [Alt] + [Tab] vài lần và kiểm tra e-mail và facebook trên đường từ A đến B. Nghiêm túc, mặc dù, tôi cho rằng việc di chuyển chuột của một vài người dùng có thể là một thử nghiệm thú vị làm cho điều này thực tế hơn. Nó sẽ được mát mẻ để đưa vào tài khoản một vài biến, chẳng hạn như X, Y vị trí, tốc độ, thời gian, hướng hiện tại, chạy Rapid Miner và xem những gì bạn có thể trích xuất từ ​​nó. Có lẽ bạn sẽ có thể đưa ra một thuật toán phức tạp hơn. – toniedzwiedz

Trả lời

8

Có một vài điều cần lưu ý nếu bạn muốn thực hiện các phong trào nhân tạo tự nhiên, tôi nghĩ rằng:

  1. di chuyển chuột nhân thường là trong một vòng cung nhẹ vì trục chuột tay quanh cổ tay. Ngoài ra vòng cung đó rõ rệt hơn cho chuyển động ngang hơn là dọc.
  2. Con người có xu hướng đi theo hướng chung, thường vượt mục tiêu và sau đó quay trở lại mục tiêu thực tế.
  3. Tốc độ ban đầu đối với mục tiêu là khá nhanh (do đó vượt quá giới hạn nói trên) và sau đó chậm hơn một chút để nhắm mục tiêu chính xác. Tuy nhiên, nếu con trỏ gần với mục tiêu ban đầu thì việc di chuyển nhanh về phía nó không xảy ra (và cũng không vượt quá).

Đây là một chút phức tạp để xây dựng trong các thuật toán.

+0

Cảm ơn adive, tôi đang làm việc trên dự án để điều khiển từ xa từ điện thoại Android đến máy tính để bàn, hầu hết mọi người đều làm tốt nhưng trông sử dụng java để viết hàm có chút khó khăn, tôi sẽ tiếp tục làm việc này –

4

Hãy xem ví dụ này mà tôi đã viết. Bạn có thể cải thiện điều này để mô phỏng những gì Joey nói. Tôi đã viết nó rất nhanh và có rất nhiều thứ có thể được cải thiện (thuật toán và thiết kế lớp). Lưu ý rằng tôi chỉ xử lý các chuyển động từ trái sang phải.

import java.awt.AWTException; 
import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.Robot; 

public class MouseMoving { 

    public static void main(String[] args) { 
     new MouseMoving().execute(); 
    } 

    public void execute() { 
     new Thread(new MouseMoveThread(100, 50, 50, 10)).start(); 
    } 

    private class MouseMoveThread implements Runnable { 

     private Robot robot; 
     private int startX; 
     private int startY; 
     private int currentX; 
     private int currentY; 
     private int xAmount; 
     private int yAmount; 
     private int xAmountPerIteration; 
     private int yAmountPerIteration; 
     private int numberOfIterations; 
     private long timeToSleep; 

     public MouseMoveThread(int xAmount, int yAmount, 
       int numberOfIterations, long timeToSleep) { 

      this.xAmount = xAmount; 
      this.yAmount = yAmount; 
      this.numberOfIterations = numberOfIterations; 
      this.timeToSleep = timeToSleep; 

      try { 

       robot = new Robot(); 

       Point startLocation = MouseInfo.getPointerInfo().getLocation(); 
       startX = startLocation.x; 
       startY = startLocation.y; 

      } catch (AWTException exc) { 
       exc.printStackTrace(); 
      } 

     } 

     @Override 
     public void run() { 

      currentX = startX; 
      currentY = startY; 

      xAmountPerIteration = xAmount/numberOfIterations; 
      yAmountPerIteration = yAmount/numberOfIterations; 

      while (currentX < startX + xAmount && 
        currentY < startY + yAmount) { 

       currentX += xAmountPerIteration; 
       currentY += yAmountPerIteration; 

       robot.mouseMove(currentX, currentY); 

       try { 
        Thread.sleep(timeToSleep); 
       } catch (InterruptedException exc) { 
        exc.printStackTrace(); 
       } 

      } 

     } 

    } 

} 
+0

Cảm ơn bạn đã viết mã, Tôi sẽ tiếp tục công việc và xem tôi có thể làm gì với nó –

+0

Bạn được chào đón! – davidbuzatto

Các vấn đề liên quan