2017-06-27 3 views
0

私は2点を得ました。own=(x, y, z)en=(x, y, z)は、私自身の世界と他の選手の位置を表しています。もう1人のプレーヤーにはpitch(90度から-90度)とyaw(0から360度)があります。私は他の選手の表情と自分の位置との間の角度を計算したい。 2DでC++ベクトルとポイントの間の角度

、アルファは私が計算しようとしているものです:

enter image description here

int main() 
{ 
    float own_x = 1, own_y = 1, own_z = 1; 
    float en_x = 10, en_y = 1, en_z = 10; 
    float pi = 3.14159265; 
    float pitch = 0.f * (pi/180), yaw = 45.f * (pi/180); 
    float x = sin(yaw) * cos(pitch); 
    float y = sin(pitch); 
    float z = cos(pitch) * cos(yaw); 
    float vec_length = sqrt(pow(en_x - own_x, 2) + pow(en_y - own_y, 2) + pow(en_y - own_y, 2)); 
    x /= vec_length; 
    y /= vec_length; 
    z /= vec_length; 
    float cos_t = ((en_x - own_x)*x + (en_y - own_y)*y + (en_z - own_z)*z)/sqrt(pow(en_x - own_x, 2) + pow(en_y - own_y, 2) + pow(en_y - own_y, 2)); 
    float arc = acos(cos_t) * (180/pi); 
    return 0; 
} 
+9

問題とは何ですか? – UnholySheep

+0

これは正しい天使(この例では180)を与えません –

+0

コードをデバッグしますか? cos_tの計算で – UnholySheep

答えて

1
  1. あなたがen-ownの長さで二回分割:あなたは vec_lengthを削除し、xyz /= vec_length必要があります。 cos_t
  2. あなたの部門バグがある、あなたは 表現の代わりに、_y_z

ノートで二回_yを使用します。代わりに、捕虜の(X、2)、のx * xを使用し、それが(速く通常ありますコンパイラはpow(x、2)をx * xに最適化しないかもしれません。

+0

mmmがcos> 1になりました。おそらく唯一の問題ではありません –

+0

あなたの例では、余分な除算を削除すると、私は 'cos_t = 0.157'を得ました。あなたは 'cos_t> 1'を得た例を挙げることができますか? – geza

+0

私の例では、結果は180度でなければなりません(それは私が得ようとしているものです) –

関連する問題