7

是否可以根据鼠标最后位置和当前位置获取鼠标方向(左、右、上、下)?我已经编写了代码来计算两个向量之间的角度,但我不确定它是否正确。

有人可以指出我正确的方向吗?

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

4 回答 4

13

计算角度似乎过于复杂。为什么不这样做:

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;
于 2009-11-06T18:29:42.587 回答
6

我认为你不需要计算角度。给定两个点 P1 和 P2,您可以检查是否 P2.x > P1.x 并且您知道它是向左还是向右。然后查看 P2.y > P1.y,您就知道它是上升还是下降。

然后查看它们之间增量的绝对值中的较大者,即 abs(P2.x - P1.x) 和 abs(P2.y - P1.y),以较大者为准,告诉您它是否“更水平”或“更垂直”,然后您可以决定向上向左移动的东西是向上还是向左。

于 2009-11-06T18:30:04.313 回答
1

0,0 是左上角。如果当前 x > 最后 x,那么您将正确。如果当前 y > last y,那么您将下降。如果您只对上\下、左\右感兴趣,则无需计算角度。

于 2009-11-06T18:31:18.117 回答
0

粗略地说,如果最后一个位置和当前位置之间的水平移动(X坐标差)的幅度(绝对值)大于最后一个位置之间的垂直移动(Y坐标差)的幅度(绝对值)位置和当前位置,则运动是向左还是向右;否则,它是向上或向下。然后你所要做的就是检查运动方向的标志,告诉你运动是向上还是向下或向左或向右。

您不必担心角度。

于 2009-11-06T18:30:10.247 回答