Come trovo l'angolo tra due vettori?


9

Ho 3 punti sul mio schermo:

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

Ho disegnato alcune linee in modo che tu possa vedere i vettori.

Voglio essere in grado di ottenere l'angolo tra aeb. Ho provato questo, ma non funziona, qualcuno sa cosa sto facendo di sbagliato ?:

//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));

La risposta che di solito ricevo è tra 0 e 1. Come posso risolvere questo problema in modo da ottenere l'angolo in gradi?

Risposte:


16

Stai cercando il meraviglioso 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);

Normalmente viene usato come atan2(y,x)ma poiché stai cercando l'angolo con la linea verticale, devi atan2(-x,y)invece usare .


+1 per il modo in cui stai ruotando la cornice di riferimento di 90 gradi.
Steve H,

@PoiXen scusate, avevo confuso v1 e v2 nella formula; Ora l'ho risolto, ma ha funzionato davvero per te la prima volta?
Sam Hocevar,

2

Vedo che usi il prodotto dot, prova invcos (valore) che potrebbe fare la cosa (ma non ne sono sicuro).

Altrimenti fallo nel modo "normale" con atan2 (dy / dx):

b=b-c:
angle=atan2(b.y, b.x);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.