ฉันจะหามุมระหว่างเวกเตอร์สองตัวได้อย่างไร


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)แทน


+1 สำหรับวิธีที่คุณหมุนกรอบอ้างอิง 90 องศา
Steve H

@PoiXen ขอโทษฉันสับสน v1 และ v2 ในสูตร; ตอนนี้ฉันซ่อมมันแล้ว แต่มันได้ผลสำหรับคุณเป็นครั้งแรกหรือเปล่า
sam hocevar

2

ฉันเห็นคุณใช้ผลิตภัณฑ์ดอทลอง invcos (ค่า) มันอาจทำสิ่งนั้น (แต่ไม่แน่ใจ)

มิฉะนั้นเพียงใช้วิธี 'ปกติ' กับ atan2 (dy / dx):

b=b-c:
angle=atan2(b.y, b.x);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.