İki vektör arasındaki açıyı nasıl bulabilirim?


9

Ekranımda 3 puan var:

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

Vektörleri görebilmek için bazı çizgiler çizdim.

A ve b arasındaki açıyı elde etmek istiyorum. Bunu denedim ama işe yaramıyor, ne yaptığımı bilen var mı ?:

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

Genellikle aldığım cevap 0 ile 1 arasındadır. Açıyı derece olarak elde etmek için bunu nasıl düzeltirim?

Yanıtlar:


16

Harika atan2'yi arıyorsunuz .

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

Normal olarak kullanılır, atan2(y,x)ancak dikey çizgiyle açıyı aradığınız için, atan2(-x,y)bunun yerine kullanmanız gerekir .


Referans çerçevesini 90 derece döndürme yönteminiz için +1.
Steve H

@PoiXen üzgünüm, formülde v1 ve v2'yi karıştırdım; Şimdi düzelttim ama ilk kez gerçekten işe yaradı mı?
sam hocevar

2

Nokta ürün kullandığınızı görüyorum, invcos (değer) 'i deneyin, ama bunu yapabilir (ama emin değilim).

Aksi takdirde sadece atan2 (dy / dx) ile 'normal' bir yol yapın:

b=b-c:
angle=atan2(b.y, b.x);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.