Tengo 3 puntos en mi pantalla:
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 |
|______._______|
He dibujado algunas líneas para que puedas ver los vectores.
Quiero poder obtener el ángulo entre a y b. He intentado esto, pero no funciona, ¿alguien sabe lo que estoy haciendo mal ?:
//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 respuesta que generalmente obtengo es entre 0 y 1. ¿Cómo soluciono esto para obtener el ángulo en grados?
Veo que usas un producto punto, prueba invcos (valor), podría hacer lo correcto (pero no estoy seguro).
De lo contrario, hágalo de la manera 'regular' con atan2 (dy / dx):
fuente