2012-08-26 22 views
9

Sto lavorando a un progetto sul controllo remoto, invio conrdinate xey del cursore da client a server.Classe Java robot che simula il movimento del mouse umano

Ma

robot.mouseMove(x,y); 

si sposta solo il cursore sul punto particolare senza spostare il punto di forma del cursore originale

devo trovare questo semplice algorthim per simulare il movimento continuo di topo

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

Ma questo algorthim è ancora troppo semplice, si muove lentamente da un punto all'altro lentamente, il che a differenza del comportamento umano.

Ho letto un codice laghetti L'alimento aperto circa il controllo remoto da web, e trovo questo progetto http://code.google.com/p/java-remote-control/ sta usando il MosueMovement chiamata di metodo dalla classe MouseListener, che usano per eseguire la "trascinamento".

Mi piacerebbe sapere qualcun altro sa il modo migliore per farlo?

+1

Si consiglia di raccogliere alcuni dati da utenti umani e quindi utilizzarli in vari modi per replicare la simulazione umana. –

+0

Dal tuo post sembra che la tua lamentela principale sia che la velocità di movimento del mouse è sbagliata. Se questo è il problema principale, è possibile regolare il codice per rendere il movimento del mouse una velocità costante, quindi regolare tale velocità fino a quando non si avvicina al livello ottimale. –

+1

Forse potresti [Alt] + [Tab] un paio di volte e controlla via e-mail e facebook sulla strada da A a B. Seriamente, penso che registrare il movimento del mouse di un paio di utenti potrebbe essere un interessante esperimento per renderlo più realistico. Sarebbe bello prendere in considerazione un paio di variabili, come la posizione X, Y, velocità, tempo, direzione corrente, eseguire Rapid Miner e vedere cosa è possibile estrarre da esso. Forse saresti in grado di trovare un algoritmo più sofisticato. – toniedzwiedz

risposta

8

ci sono alcune cose da prendere in considerazione se si vuole fare il movimento artificiale naturale, penso:

  1. movimento del mouse umana è di solito in un leggero arco, perché i perni del mouse mano intorno al polso. Anche quell'arco è più pronunciato per i movimenti orizzontali che verticali.
  2. Gli esseri umani tendono ad andare nella direzione generale, spesso superano il bersaglio e poi tornano al bersaglio effettivo.
  3. La velocità iniziale verso il target è abbastanza veloce (da qui l'overshoot di cui sopra) e quindi un po 'più lentamente per un puntamento preciso. Tuttavia, se il cursore si avvicina al bersaglio inizialmente, il movimento rapido verso di esso non avviene (e nemmeno il superamento).

Questo è un po 'complesso da formulare in algoritmi, però.

+0

Grazie per adive, sto lavorando al progetto di controllo remoto da telefono Android a desktop, la maggior parte delle persone l'ha fatto bene ma sembra usare java per scrivere la funzione è un po 'difficile, continuerò a lavorare su questo –

4

Dai uno sguardo a questo esempio che ho scritto. Puoi migliorare questo per simulare quello che ha detto Joey. L'ho scritto molto velocemente e ci sono molte cose che possono essere migliorate (algoritmo e design di classe). Nota che mi occupo solo di movimenti da sinistra a destra.

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

Grazie per il codice, Continuerò a lavorare e vedrò cosa posso fare su di esso –

+0

Siete i benvenuti! – davidbuzatto

Problemi correlati