7
votes

Comment obtenir la direction de la souris cardinale des coordonnées de la souris

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

Peut-être que quelqu'un puisse me signaler à la bonne direction? P>

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


3 commentaires

J'irais jusqu'à dire que la méthode d'angle est incorrecte, période. La différence d'angle entre deux vecteurs ne vous dit rien de la direction réelle (sur le plan cartésien) que le point a déplacé.


Essayez-vous de vous accueillir pour la gigue de la souris? - Par exemple, si l'utilisateur a toujours déménagé de 100 px à droite, mais à mi-chemin gênait de quelques pixels, vous ne voulez pas échantillonner accidentellement que la gigue et suppose qu'ils vont dans l'autre moyen parce que l'image globale ne se prêter à cette conclusion


Non, j'écris un jeu qu'une image sur le formulaire devrait suivre la direction de la souris


4 Réponses :


13
votes

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


0 commentaires

6
votes

Je ne pense pas que vous devez calculer l'angle. Compte tenu de 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 allé de haut en bas.

Ensuite, examinez le plus grand des valeurs absolues du delta entre eux, c'est-à-dire ABS (P2.x - P1.x) et ABS (P2.Y - P1.Y) et que ce qui est plus grand vous dit si c'était " plus horizontal "ou" plus vertical ", puis vous pouvez décider si quelque chose qui est allé-gauche était en hausse ou à gauche.


0 commentaires

0
votes

à peu près parlant, si la magnitude (valeur absolue) du mouvement horizontal (différence de coordonnées x) entre la dernière position et la position actuelle est supérieure à la magnitude (valeur absolue) du mouvement vertical (différence dans les coordonnées Y) entre la dernière position et la position actuelle, le mouvement est laissé ou à droite; Sinon, c'est en haut ou en 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 en hausse ou à gauche ou à gauche ou à droite.

Vous ne devriez pas avoir besoin d'être préoccupé par les angles.


0 commentaires

1
votes

0,0 est le coin supérieur gauche. Si X> Dernier x, vous allez bien. Si actuel Y> dernier Y, vous descendez. Pas besoin de calculer l'angle si vous êtes juste intéressé par UP \ Down, à gauche \ droite.


0 commentaires