2つのベクトル間の角度を見つけるにはどうすればよいですか?


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。
スティーブH

@PoiXen申し訳ありませんが、式でv1とv2を混同していました。私は今それを修正しましたが、それは本当にあなたにとって初めてうまくいきましたか?
sam hocevar 2012

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.