두 벡터 사이의 각도를 어떻게 찾습니까?


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

당신은 놀라운 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)대신 사용해야 합니다.


기준 프레임을 90도 회전시키는 방식으로 +1
Steve H

@PoiXen 죄송합니다. 공식에서 v1과 v2를 혼동했습니다. 나는 지금 고쳤지만 실제로 처음으로 효과가 있었습니까?
sam hocevar

2

나는 당신이 내적을 사용하는 것을 보았습니다, invcos (value) 시도해보십시오.

그렇지 않으면 atan2 (dy / dx)를 사용하여 '일반적인'방법으로 수행하십시오.

b=b-c:
angle=atan2(b.y, b.x);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.