如何从鼠标坐标获取基本的鼠标方向

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

我敢说角度法是错误的,这一点毋庸置疑。两个向量之间的角度差不能告诉你点实际上(在笛卡尔平面上)移动的方向。 - Ron Warholic
你是否试图适应鼠标抖动?例如,如果用户一直向右移动100像素,但在中途左右抖动了几个像素,您不希望意外采样该抖动并假设他们正在朝相反的方向移动,因为整体图片并不支持这种结论。 - John K
不,我正在编写一个游戏,其中窗体上的图像应该随鼠标移动的方向而移动。 - Ioannis
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;

6
我认为你不需要计算角度。给定两个点P1和P2,您可以检查P2.x>P1.x,然后您就知道它是向左还是向右移动的。然后查看P2.y>P1.y,您就知道它是向上还是向下移动的。
接着看它们之间差值的绝对值中较大的一个,即abs(P2.x - P1.x)和abs(P2.y - P1.y),哪个更大就说明它是“更水平”还是“更垂直”的,然后您可以决定向上-向左的是向上还是向左。

1

0,0 是左上角。如果当前的 x > 上一个 x,那么你正在向右移动。 如果当前的 y > 上一个 y,那么你正在向下移动。如果你只关心上下、左右方向,就不需要计算角度。


0
粗略地说,如果上一位置和当前位置之间的水平移动(X坐标差异)的大小(绝对值)大于上一位置和当前位置之间的垂直移动(Y坐标差异)的大小(绝对值),则运动是左右移动;否则,它是上下移动。然后,您只需检查运动方向的符号即可告诉您运动是向上、向下还是向左、向右。
您不需要担心角度问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接