2009-11-06 14 views
6

क्या माउस की अंतिम स्थिति और वर्तमान स्थिति के आधार पर माउस दिशा (बाएं, दाएं, ऊपर, नीचे) प्राप्त करना संभव है? मैंने दो वैक्टरों के बीच कोण की गणना करने के लिए कोड लिखा है लेकिन मुझे यकीन नहीं है कि यह सही है या नहीं।माउस निर्देशांक से कार्डिनल माउस दिशा कैसे प्राप्त करें

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

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

मैं कहूंगा कि कोण विधि गलत है, अवधि। दो वैक्टरों के बीच कोण अंतर आपको वास्तविक दिशा (कार्टेशियन विमान पर) के बारे में कुछ भी नहीं बताता है जो बिंदु स्थानांतरित हो गया है। –

+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

मुझे नहीं लगता कि आपको कोण की गणना करने की आवश्यकता है। पी 1 और पी 2 के दो बिंदुओं को देखते हुए, आप यह देखने के लिए जांच सकते हैं कि P2.x> P1.x है और आप जानते हैं कि यह बाएं या दाएं चला गया है या नहीं। फिर P2.y> P1.y देखें और आप जानते हैं कि यह ऊपर या नीचे चला गया है या नहीं।

फिर उनके बीच डेल्टा के पूर्ण मूल्यों को देखें, यानी abs (P2.x - P1.x) और abs (P2.y - P1.y) और जो भी अधिक हो, वह आपको बताए कि क्या यह था "अधिक क्षैतिज" या "अधिक लंबवत" और फिर आप यह तय कर सकते हैं कि यूपी-बाएं जो कुछ हुआ वह यूपी या बाएं था।

0

कठोर बोलते हुए, यदि अंतिम स्थिति और वर्तमान स्थिति के बीच क्षैतिज चाल (एक्स समन्वय में अंतर) की परिमाण (पूर्ण मूल्य) लंबवत चाल के परिमाण (पूर्ण मूल्य) से अधिक है (वाई निर्देशांक में अंतर) अंतिम स्थिति और वर्तमान स्थिति के बीच, आंदोलन बाएं या दाएं है; अन्यथा, यह ऊपर या नीचे है। तो आपको बस इतना करना है कि आंदोलन ऊपर या नीचे या बाएं या दाएं है या नहीं, यह बताने के लिए आंदोलन दिशा के संकेत की जांच करें।

आपको कोणों के बारे में चिंतित होने की आवश्यकता नहीं है।

1

0,0 शीर्ष बाएं कोने है। यदि वर्तमान एक्स> अंतिम एक्स, तो आप सही जा रहे हैं। यदि वर्तमान वाई> अंतिम वाई, आप नीचे जा रहे हैं। यदि आप बस ऊपर \ नीचे, बाएं \ दाएं रुचि रखते हैं तो कोण की गणना करने की आवश्यकता नहीं है।

संबंधित मुद्दे