2011-09-14 19 views
6

私は2本の線の間の角度を取得したいと思います。 私はこのコードを使用しました。2行の間の角度が間違っています


int posX = (ScreenWidth) >> 1; 

int posY = (ScreenHeight) >> 1; 

double radians, degrees; 

radians = atan2f(y - posY , x - posX); 

degrees = -CC_RADIANS_TO_DEGREES(radians); 

NSLog(@"%f %f",degrees,radians); 

しかし、それは動作しません。 ログは次のとおりです。146.309935 -2.553590

何が問題なのですか? 理由を知ることができません。 私を助けてください。

enter image description here

+0

垂直線はどうですか、常に垂直ですか? – Ariel

+1

あなたの計算式が間違っています – duedl0r

+1

'x'、' y'、 'ScreenWidth'と' ScreenHeight'の値はわかりませんが、これは正しいと思われます。 。あなたはどんな結果を期待していましたか? – filipe

答えて

5

あなたは単にあなたが水平線y=posY(青角度)との角度を取得します

radians = atan2f(y - posY , x - posX); 

を使用している場合。

enter image description here

あなたは正しい結果を得るためにあなたのラジアン値にM_PI_2を追加する必要があります。

+0

もっと詳しく説明してください。 – bTagTiger

+0

あなたの画像を編集しました。赤い角度ではなく青の角度を計算しています。 – Saphrosit

4

ここに私が使用する機能があります。私が見つけたいくつかの研究は、あなただけのatan2(y,x)を使用することができた後:それは

float cartesianAngle(float x, float y) { 
    float a = atanf(y/(x ? x : 0.0000001)); 
    if  (x > 0 && y > 0) a += 0; 
    else if (x < 0 && y > 0) a += M_PI; 
    else if (x < 0 && y < 0) a += M_PI; 
    else if (x > 0 && y < 0) a += M_PI * 2; 
    return a; 
} 

EDIT ...私のために素晴らしい作品。ほとんどのコンパイラライブラリにはこの機能があります。上記の私の機能を無視することができます。

1

あなたは3点を持っており、ここではそれらの間の角度を計算したい場合は、右の角度値を算出する迅速かつ正しい方法です:

double AngleBetweenThreePoints(CGPoint pointA, CGPoint pointB, CGPoint pointC) 
{ 
    CGFloat a = pointB.x - pointA.x; 
    CGFloat b = pointB.y - pointA.y; 
    CGFloat c = pointB.x - pointC.x; 
    CGFloat d = pointB.y - pointC.y; 

    CGFloat atanA = atan2(a, b); 
    CGFloat atanB = atan2(c, d); 

    return atanB - atanA; 
} 

あなたはのいずれかにポイントを指定する場合、これはあなたのために動作します線、交点、および他の線の点。

関連する問題