7

マウスの最後の位置と現在の位置に基づいて、マウスの方向(左、右、上、下)を取得することは可能ですか?2つのベクトル間の角度を計算するコードを作成しましたが、それが正しいかどうかはわかりません。

誰かが私を正しい方向に向けてくれませんか?

    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

角度を計算する必要はないと思います。2つのポイントP1とP2が与えられた場合、P2.x> P1.xであるかどうかを確認し、左または右に移動したかどうかを確認できます。次に、P2.y> P1.yを見ると、上昇したか下降したかがわかります。

次に、それらの間のデルタの絶対値の大きい方、つまりabs(P2.x-P1.x)とabs(P2.y-P1.y)を見て、どちらか大きい方が「より水平」であったかどうかを示します。または「より垂直」にすると、UP-LEFTになったものがUPかLEFTかを判断できます。

于 2009-11-06T18:30:04.313 に答える
1

0,0 は左上隅です。現在の x > 最後の x の場合は、正しいことになります。現在の y > 最後の y の場合は、下落しています。上\下、左\右だけに興味がある場合は、角度を計算する必要はありません。

于 2009-11-06T18:31:18.117 に答える
0

大まかに言うと、前回の位置と現在の位置の横移動(X座標の差)の大きさ(絶対値)が、前回の位置と現在位置の縦移動(Y座標の差)の大きさ(絶対値)よりも大きい場合。位置と現在の位置、移動は左または右です。それ以外の場合は、アップまたはダウンです。あとは、移動方向の符号を確認するだけで、移動が上か下か左か右かがわかります。

角度を気にする必要はありません。

于 2009-11-06T18:30:10.247 に答える