質問

これは、マウスの最後の位置と現在位置に基づいて、マウスの方向(左、右、上、下)を取得することは可能でしょうか?私は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);
    }
役に立ちましたか?

解決

の角度を計算することは過度に複雑そうです。

:理由だけのような何かをしません
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;

他のヒント

私はあなたの角度を計算する必要はないと思います。 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ます。

0,0は左上隅です。現在のx>最後のx場合は、右つもりです。 現在のy>最後のyの場合は、ダウンつもりです。あなたがアップでちょうど興味があるならダウン\角度を計算する必要はありません、右\残っていない。

最後の位置と現在位置との間で水平移動(X差座標)の大きさ(絶対値)が垂直移動(Y座標の差)の大きさ(絶対値)よりも大きい場合には、

大まかに言えば、最後の位置と現在位置との間で、その後の動きは、左または右です。それ以外の場合は、アップまたはダウンしています。そして、あなたがしなければならないすべては動きが左または右の上または下であるかどうかを伝えるために、移動方向の兆候を確認している。

あなたが角度を心配する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top