আমি দুটি ভেক্টরের মধ্যে কোণটি কীভাবে খুঁজে পাব?


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

আপনি বিস্ময়কর atan2 খুঁজছেন ।

// 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)পরিবর্তে আপনাকে ব্যবহার করতে হবে।


আপনি 90 ডিগ্রি রেফারেন্সের ফ্রেমটি যেভাবে ঘোরছেন তার জন্য +1।
স্টিভ এইচ

@ পইএক্সেন দুঃখিত, আমি সূত্রটিতে v1 এবং v2 গুলিয়ে ফেলেছিলাম; আমি এখন এটি ঠিক করে ফেলেছি তবে এটি কি আপনার জন্য প্রথমবারের মতো কার্যকর হয়েছে?
সাম হোচেভার

2

আমি দেখতে পাচ্ছি যে আপনি বিন্দু পণ্য ব্যবহার করছেন, ইনকোসগুলি (মান) চেষ্টা করুন এটি কাজটি করতে পারে (তবে নিশ্চিত নয়)।

অন্যথায় এটি এটান 2 (ডাই / ডিএক্স) দিয়ে 'নিয়মিত' উপায়ে করুন:

b=b-c:
angle=atan2(b.y, b.x);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.