मैं दो वैक्टरों के बीच के कोण को कैसे पता करूँ?


9

मेरी स्क्रीन पर मेरे 3 अंक हैं:

a = a point which is (c.x, 0) makes a line pointing straight up
b = a user input touch, can be anywhere on the screen
c = a moving object

       a
_______.________
|      |       |
|      |       | 
|   b  |       |
|  .   |       |
|   \  |       |
|    \ |       | 
|     \|       |
|      | c     |
|______._______|

मैंने कुछ लाइनें खींची हैं ताकि आप वैक्टर देख सकें।

मैं ए और बी के बीच के कोण को प्राप्त करने में सक्षम होना चाहता हूं। मैंने यह कोशिश की है, लेकिन यह काम नहीं करता है, क्या किसी को पता है कि मैं क्या गलत कर रहा हूं? "

//v1 moving object
float boxX = this.mScene.getLastChild().getX(); 
float boxY = this.mScene.getLastChild().getY();

//v2 user touch
float touchX = pSceneTouchEvent.getX();
float touchY = pSceneTouchEvent.getY();     

//v3 top of screen
float topX = boxX;
final float topY = 0;

float dotProd = (touchX * topX) + (touchY * topY);

float sqrtBox = (touchX * touchX) + (touchY * touchY);
float sqrtTouch = (topX * topX) + (topY * topY);

double totalSqrt = sqrtBox * sqrtTouch;
double theta = Math.acos(dotProd / Math.sqrt(totalSqrt));

आमतौर पर मुझे जो उत्तर मिलता है वह 0 और 1 के बीच होता है। मैं इसे कैसे ठीक करूं ताकि मुझे डिग्री में कोण मिले?

जवाबों:


16

आप चमत्कारिक एटैन 2 की तलाश कर रहे हैं ।

// v1 moving object
float boxX = this.mScene.getLastChild().getX(); 
float boxY = this.mScene.getLastChild().getY();

// v2 user touch
float touchX = pSceneTouchEvent.getX();
float touchY = pSceneTouchEvent.getY();     

double theta = 180.0 / Math.PI * Math.atan2(boxX - touchX, touchY - boxY);

आम तौर पर इसका उपयोग किया जाता है, atan2(y,x)लेकिन जब से आप ऊर्ध्वाधर रेखा के साथ कोण की तलाश कर रहे हैं, तो आपको atan2(-x,y)इसके बजाय उपयोग करने की आवश्यकता है ।


+1 जिस तरह से आप संदर्भ 90 डिग्री के फ्रेम को घुमा रहे हैं।
स्टीव एच।

@PoiXen क्षमा करें, मैंने सूत्र में v1 और v2 को भ्रमित किया था; मैंने अब इसे ठीक कर दिया लेकिन क्या यह वास्तव में आपके लिए पहली बार काम कर रहा है?
सैम होसेवर

2

मैं देख रहा हूं कि आप डॉट उत्पाद का उपयोग करते हैं, इनवोकस (मूल्य) की कोशिश करें यह काम कर सकता है (लेकिन निश्चित नहीं)।

अन्यथा बस इसे atan2 (डाई / डीएक्स) के साथ 'नियमित' तरीके से करें:

b=b-c:
angle=atan2(b.y, b.x);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.