Как мне найти угол между двумя векторами?

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. Как это исправить, чтобы получить угол в градусах?

maffo
источник

Ответы:

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)вместо этого.

Сэм Хоцевар
источник
+1 за то, как вы поворачиваете систему отсчета на 90 градусов.
Стив Х
@PoiXen извините, я перепутал v1 и v2 в формуле; Я сейчас исправил это, но действительно ли это сработало для вас в первый раз?
Сам Хочевар
2

Я вижу, вы используете точечный продукт, попробуйте invcos (value), он может сработать (но не уверен).

В противном случае просто сделайте это 'обычным' способом с atan2 (dy / dx):

b=b-c:
angle=atan2(b.y, b.x);
Valmond
источник