Come arrivare direzione cardinale del mouse da coordinate del mouse
-
18-09-2019 - |
Domanda
è possibile ottenere la direzione del mouse (sinistra, destra, su, giù) sulla base del mouse ultima posizione e la posizione attuale? Ho scritto il codice per calcolare l'angolo tra due vettori, ma non sono sicuro se è giusto.
Qualcuno può per favore mi punto nella giusta direzione?
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);
}
Soluzione
INFORMATICA l'angolo sembra troppo complessa. Perché non fare qualcosa di simile:
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;
Altri suggerimenti
Non credo che è necessario calcolare l'angolo. Dati due punti P1 e P2, è possibile controllare per vedere se P2.x> P1.x e non si sa se è andato a sinistra oa destra. Poi guardate P2.y> P1.y e si sa se è andato verso l'alto o verso il basso.
Poi guarda il maggiore dei valori assoluti del delta tra di loro, vale a dire abs (P2.x - P1.x) e abs (P2.y - P1.y) e il valore maggiore ti dice se fosse " più orizzontale" o 'più verticale' e quindi si può decidere se qualcosa che è andato UP-sinistra era alto oa sinistra.
0,0 è l'angolo in alto a sinistra. Se la corrente x> ultima x, si sta andando a destra. Se y corrente> ultima y, si sta andando verso il basso. Non c'è bisogno di calcolare l'angolo, se siete solo interessati a up \ basso, a sinistra \ destra.
povere, se la grandezza (valore assoluto) del movimento orizzontale (differenza di coordinate X) tra l'ultima posizione e la posizione attuale è maggiore della grandezza (valore assoluto) di movimento verticale (differenza di coordinate Y) tra l'ultima posizione e la posizione corrente, allora il movimento a sinistra oa destra; in caso contrario, è alto o in basso. Poi tutto quello che dovete fare è controllare il segno della direzione del movimento di dirvi se il movimento è verso l'alto o verso il basso o verso sinistra o verso destra.
Non si dovrebbe bisogno di essere preoccupato per gli angoli.