Question

est-il possible d'obtenir la direction de la souris (gauche, droite, haut, bas) basée sur la souris dernière position et la position actuelle? J'ai écrit le code pour calculer l'angle entre deux vecteurs mais je ne suis pas sûr si elle est juste.

Quelqu'un peut-il s'il vous plaît me pointer vers la bonne direction?

    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);
    }
Était-ce utile?

La solution

Calcul de l'angle semble trop complexe. Pourquoi ne pas simplement faire quelque chose comme:

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;

Autres conseils

Je ne pense pas que vous devez calculer l'angle. Étant donné deux points P1 et P2, vous pouvez vérifier si P2.x> P1.x et vous savez s'il est allé à gauche ou à droite. Ensuite, regardez à P2.y> P1.y et vous savez s'il est passé ou vers le bas.

Ensuite, regardez la plus grande des valeurs absolues du delta entre eux, à savoir abs (P2.x - P1.x) et ABS (P2.y - P1.y) et selon le plus élevé vous indique si elle était " plus horizontal » ou « plus verticale » et vous pouvez décider si quelque chose qui gravit-gauche était haut ou à gauche.

0,0 est le coin supérieur gauche. Si le courant x> dernier x, vous allez à droite. Si le courant y> dernier y, vous allez vers le bas. Pas besoin de calculer l'angle si vous êtes simplement intéressé par haut \ bas, gauche \ droite.

Grosso modo, si l'amplitude (valeur absolue) de déplacement horizontal (différence de coordonnées X) entre la dernière position et la position actuelle est supérieure à l'amplitude (valeur absolue) du déplacement vertical (différence en coordonnées Y) entre la dernière position et la position actuelle, le mouvement est à gauche ou à droite; sinon, il est haut ou le bas. Ensuite, tout ce que vous avez à faire est de vérifier le signe de la direction du mouvement pour vous dire si le mouvement est vers le haut ou vers le bas ou vers la gauche ou la droite.

Vous ne devriez pas avoir à se préoccuper des angles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top