كيفية الحصول على اتجاه الماوس الكاردينال من إحداثيات الماوس

StackOverflow https://stackoverflow.com/questions/1689397

سؤال

هل من الممكن الحصول على اتجاه الماوس (يسار، يمين، لأعلى) بناء على موقع الماوس الأخير والموضع الحالي؟ لقد كتبت الشفرة لحساب الزاوية بين متجهين، لكنني لست متأكدا مما إذا كان صحيحا.

يمكن للشخص الرجاء توجيه لي إلى الاتجاه الصحيح؟

    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;

نصائح أخرى

لا أعتقد أنك بحاجة لحساب الزاوية. نظرا لنقطتين P1 و P2، يمكنك التحقق لمعرفة ما إذا كان P2.x> P1.x وأنت تعرف ما إذا كان قد ذهب إلى اليسار أو اليمين. ثم انظر إلى P2.Y> P1.Y وأنت تعرف ما إذا كانت مرت لأعلى أو لأسفل.

ثم انظر إلى أكبر القيم المطلقة للدولة بينهما، أي ABS (P2.x - P1.x) و ABS (P2.Y - P1.Y) وأي كان أكبر يخبرك إذا كان "أكثر أفقية" أو "أكثر عموديا" وبعد ذلك يمكنك أن تقرر ما إذا كان هناك شيء تم ترتفع اليسار أو يسارا.

0،0 هو الزاوية اليسرى العليا. إذا كان X الحالي> آخر س، فأنت ذاهب إلى اليمين. إذا كان هذا Y> آخر ذ، فأنت تراجع. لا حاجة لحساب الزاوية إذا كنت مهتما فقط في UP Down، ...

التحدث تقريبا، إذا كان الحجم (القيمة المطلقة) للحركة الأفقية (الفرق في X الإحداثيات) بين الموقف الأخير والمركز الحالي أكبر من الحجم (القيمة المطلقة) للخطوة الرأسي (الفرق في الإحداثيات Y) بين الأخير الموقف والموقع الحالي، ثم يتم ترك الحركة أو اليمين؛ خلاف ذلك، الأمر أعلى أو لأسفل. ثم كل ما عليك فعله هو التحقق من علامة اتجاه الحركة لإخبارك إذا كانت الحركة لأعلى أو أسفل أو يسارها أو اليمين.

يجب أن لا تحتاج إلى أن تشعر بالقلق إزاء الزوايا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top