2009-11-06 7 views
6

マウスの最後の位置と現在の位置に基づいてマウスの方向(左、右、上、下)を得ることは可能ですか?私は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); 
    } 
+0

角度方法が間違っていると言っても過言ではありません。 2つのベクトルの間の角度差は、ポイントが移動した実際の方向(デカルト平面上)については何も教えてくれません。 –

+0

マウスジッタに対応しようとしていますか? - たとえば、ユーザーが100ピクセル右に動いていて、途中で数ピリオドのジッターが発生した場合は、間違ってそのジッタをサンプリングして、それ以外の方向に進むことは想定したくありません。その結論に向いています –

+0

いいえ、私はフォーム上の画像がマウスの指示に従うゲームを書いています – Ioannis

答えて

12

角度の計算は非常に複雑です。ちょうど次のようなことをするのはなぜですか?

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; 
+0

あなたの助けに感謝します - これは問題なく動作します – Ioannis

5

角度を計算する必要はありません。 2つの点P1とP2が与えられた場合、P2.x> P1.xであるかどうかを確認し、左か右かを知ることができます。次に、P2.y> P1.yを見て、それが上がったか下がったかを知っています。

次に、abs(P2.x-P1.x)とabs(P2.y-P1.y)の間のデルタの絶対値のうち大きい方を見てください。どちらが大きいかはあなたに分かります「より水平」または「より垂直」とし、上向きになったものが上か左かを判断できます。

0

大まかに言えば、最終位置と現在位置との間の水平移動(X座標の差)の大きさ(絶対値)が、垂直移動の大きさ(絶対値) )が最後の位置と現在の位置の間にあれば、動きは左または右になります。それ以外の場合は、それは上または下です。それから、あなたがしなければならないのは、動きの方向を表す記号をチェックして、動きが上下左右かを教えてくれることです。

アングルについて心配する必要はありません。

1

0,0は左上隅です。現在のx>最後のxなら、あなたは正しく行くでしょう。 現在のy>最後のyなら、あなたはダウンしています。ちょうど上向きに\\ down、左\右に興味があれば角度を計算する必要はありません。

関連する問題