2009-11-06 19 views
6

è possibile ottenere la direzione del mouse (Sinistra, Destra, Su, Giù) in base all'ultima posizione del mouse e alla posizione corrente? Ho scritto il codice per calcolare l'angolo tra due vettori, ma non sono sicuro che sia giusto.Come ottenere la direzione del mouse da coordinate del mouse

Qualcuno può indicarmi la direzione giusta?

public enum Direction 
    { 
     Left = 0, 
     Right = 1, 
     Down = 2, 
     Up = 3 
    } 

    private int lastX; 
    private int lastY; 
    private Direction direction; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     lastX = e.X; 
     lastY = e.Y; 
    } 
    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     double angle = GetAngleBetweenVectors(lastX, lastY, e.X, e.Y); 
     System.Diagnostics.Debug.WriteLine(angle.ToString()); 
     //The angle returns a range of values from -value 0 +value 
     //How to get the direction from the angle? 
     //if (angle > ??) 
     // direction = Direction.Left; 
    } 

    private double GetAngleBetweenVectors(double Ax, double Ay, double Bx, double By) 
    { 
     double theta = Math.Atan2(Ay, Ax) - Math.Atan2(By, Bx); 
     return Math.Round(theta * 180/Math.PI); 
    } 
+0

Direi che il metodo dell'angolo non è corretto, punto. La differenza di angolo tra due vettori non ti dice nulla sulla direzione effettiva (sul piano cartesiano) che il punto si è spostato. –

+0

Stai provando ad accettare il jitter del mouse? - Ad esempio se l'utente ha spostato costantemente 100 px a destra, ma a metà strada jitter avanti e indietro di alcuni pixel, non si desidera campionare accidentalmente quel jitter e assumere che stanno andando nell'altro senso perché l'immagine complessiva non prestami a questa conclusione –

+0

No, sto scrivendo un gioco che un'immagine sul modulo dovrebbe seguire la direzione del mouse – Ioannis

risposta

12

Calcolare l'angolo sembra eccessivamente complesso. Perché non fare qualcosa del tipo:

int dx = e.X - lastX; 
int dy = e.Y - lastY; 
if(Math.Abs(dx) > Math.Abs(dy)) 
    direction = (dx > 0) ? Direction.Right : Direction.Left; 
else 
    direction = (dy > 0) ? Direction.Down : Direction.Up; 
+0

grazie a tutti per il vostro aiuto - questo funziona bene – Ioannis

5

Non penso che sia necessario calcolare l'angolo. Dati due punti P1 e P2, puoi verificare se P2.x> P1.x e sai se è andato a sinistra oa destra. Quindi guarda P2.y> P1.y e sai se è andato su o giù.

Quindi guarda il più grande dei valori assoluti del delta tra di loro, cioè abs (P2.x - P1.x) e abs (P2.y - P1.y) e quale è maggiore ti dice se era "più orizzontale" o "più verticale" e poi puoi decidere se qualcosa che è andato SOPRA SINISTRA è A SINISTRA o A SINISTRA.

0

In parole povere, se la grandezza (valore assoluto) del movimento orizzontale (differenza di coordinate X) tra l'ultima posizione e la posizione corrente è maggiore della magnitudine (valore assoluto) del movimento verticale (differenza in coordinate Y) tra l'ultima posizione e la posizione corrente, quindi il movimento è a sinistra oa destra; altrimenti, è su o giù. Quindi tutto quello che devi fare è controllare il segno della direzione del movimento per dirti se il movimento è verso l'alto o verso il basso o verso sinistra o verso destra.

Non è necessario preoccuparsi degli angoli.

1

0,0 è l'angolo in alto a sinistra. Se corrente x> last x, stai andando a destra. Se attuale y> last y, stai andando giù. Non c'è bisogno di calcolare l'angolo se sei solo interessato a \ down, left \ right.

Problemi correlati