Як знайти кут між двома векторами?


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     |
|______._______|

Я намалював кілька ліній, щоб можна було побачити вектори.

Я хочу мати змогу отримати кут між a і b. Я спробував це, але це не працює, чи хтось знає, що я роблю не так ?:

//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 градусів.
Стів H

@PoiXen вибачте, я переплутав v1 і v2 у формулі; Я зараз це виправив, але чи справді він спрацював для вас перший раз?
sam hocevar

2

Я бачу, ви використовуєте крапковий продукт, спробуйте invcos (значення), що може зробити це (але не впевнене).

В іншому випадку просто зробіть це "звичайним" способом з atan2 (dy / dx):

b=b-c:
angle=atan2(b.y, b.x);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.