Làm thế nào để tôi tìm góc giữa hai vectơ?


9

Tôi có 3 điểm trên màn hình:

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

Tôi đã vẽ một số dòng để bạn có thể nhìn thấy các vectơ.

Tôi muốn có thể có được góc giữa a và b. Tôi đã thử điều này, nhưng nó không hoạt động, có ai biết tôi đang làm gì không?:

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

Câu trả lời tôi thường nhận được là từ 0 đến 1. Làm cách nào để khắc phục điều này để tôi có được góc theo độ?

Câu trả lời:


16

Bạn đang tìm kiếm atan2 tuyệt vời .

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

Thông thường nó được sử dụng như atan2(y,x)nhưng vì bạn đang tìm kiếm góc với đường thẳng đứng, nên bạn cần sử dụng atan2(-x,y)thay thế.


+1 cho cách bạn xoay khung tham chiếu 90 độ.
Steve H

@PoiXen xin lỗi, tôi đã nhầm lẫn v1 và v2 trong công thức; Bây giờ tôi đã sửa nó nhưng lần đầu tiên nó có thực sự hiệu quả với bạn không?
sam hocevar

2

Tôi thấy bạn sử dụng sản phẩm chấm, thử invcos (giá trị) nó có thể làm điều đó (nhưng không chắc chắn).

Mặt khác, chỉ cần thực hiện theo cách 'thông thường' với atan2 (dy / dx):

b=b-c:
angle=atan2(b.y, b.x);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.