Ich habe 3 Punkte auf meinem Bildschirm:
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 |
|______._______|
Ich habe einige Linien gezeichnet, damit Sie die Vektoren sehen können.
Ich möchte den Winkel zwischen a und b ermitteln können. Ich habe es versucht, aber es funktioniert nicht. Weiß jemand, was ich falsch mache?:
//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));
Die Antwort, die ich normalerweise bekomme, liegt zwischen 0 und 1. Wie behebe ich das, damit ich den Winkel in Grad erhalte?
Ich sehe, dass Sie Punktprodukt verwenden, versuchen Sie invcos (Wert), es könnte die Sache tun (aber nicht sicher).
Ansonsten mache es einfach 'normal' mit atan2 (dy / dx):
quelle