Как получить кардинальное направление мыши по координатам мыши

StackOverflow https://stackoverflow.com/questions/1689397

Вопрос

Можно ли получить направление мыши (влево, вправо, вверх, вниз) на основе последней позиции мыши и текущей позиции?Я написал код для расчета угла между двумя векторами, но не уверен, правильно ли он.

Может ли кто-нибудь указать мне правильное направление?

    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);
    }
Это было полезно?

Решение

Вычисление угла кажется слишком сложным.Почему бы просто не сделать что-то вроде:

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;

Другие советы

Я думаю, вам не нужно рассчитывать угол.Учитывая две точки P1 и P2, вы можете проверить, P2.x > P1.x, и узнать, пошло ли оно влево или вправо.Затем посмотрите на P2.y > P1.y и вы узнаете, пошло ли оно вверх или вниз.

Затем посмотрите на большее из абсолютных значений дельты между ними, т.е.abs(P2.x - P1.x) и abs(P2.y - P1.y) и то, что больше, скажет вам, было ли оно «более горизонтальным» или «более вертикальным», а затем вы можете решить, произошло ли что-то, что пошло ВВЕРХ. ВЛЕВО было ВВЕРХ или ВЛЕВО.

0,0 — верхний левый угол.Если текущий x > последний x, вы идете правильно.Если текущий y > последний y, вы идете вниз.Нет необходимости рассчитывать угол, если вас интересуют только верх\низ, лево\право.

Грубо говоря, если величина (абсолютное значение) горизонтального перемещения (разница в координатах X) между последней позицией и текущей позицией больше, чем величина (абсолютное значение) вертикального перемещения (разница в координатах Y) между последней позиция и текущая позиция, затем движение влево или вправо;в противном случае это вверх или вниз.Тогда все, что вам нужно сделать, это проверить знак направления движения, чтобы узнать, происходит ли движение вверх или вниз, влево или вправо.

Вам не нужно беспокоиться об углах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top