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

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

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

    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);
    }
 Ron Warholic06 нояб. 2009 г., 19:32
Я бы зашел так далеко, чтобы сказать, что метод угла неверен, точка. Разница углов между двумя векторами нене сказать вам ничего о фактическом направлении (в декартовой плоскости), что точка сместилась.
 John K06 нояб. 2009 г., 19:38
Вы пытаетесь приспособиться к дрожанию мыши? - Например, если пользователь последовательно переместился на 100 пикселей вправо, но на полпути вздрогнул вперед и назад на несколько пикселей, вы не будетене хочу случайно взять этот джиттер и предположить, что онидет другим путем, потому что общая картина нене поддается такому выводу
 Ioannis06 нояб. 2009 г., 22:02
Нет, я пишу игру, в которой изображение в форме должно следовать направлению мыши

Ответы на вопрос(4)

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

Ты не долженне нужно беспокоиться об углах.

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

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

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

Решение Вопроса

то-то вроде:

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;
 Ioannis06 нояб. 2009 г., 22:09
спасибо всем за помощь - отлично работает

Ваш ответ на вопрос