0

2D 空間の 2 点の角度を計算しようとしています。以下で動作します。

double angle;
x = player->x - x;
z = player->z - y;

angle = atan2 (x, y);
angle *= (180.0 / M_PI);
if(angle < 0) angle += 360;
if(angle >= 360) angle -= 360;

return angle;

ただし、より良い結果を得るためにテーブルを使用したい:

x = player->x - x;
z = player->y - y;

return atanTable[x+32][y+32];

その中で:

int xp = -32;
int yp = -32;
for (int x = 0; x < 64; x++, xp++)
    for (int y = 0; y < 64; y++, yp++){
        double angle;

        angle = atan2 (xp, yp);
        angle *= (180.0 / M_PI);
        if(angle < 0) angle += 360;
        if(angle >= 360) angle -= 360;
        atanTable[x][y] = angle;
    }

角度は、x と y の値が -32 ~ 32 の場合にのみ計算されます。

ただし、テーブルは適切に作成されていません。0 から 360 度の範囲を取得する必要がありますが、値は約 359 と 0 しか取得できません。

どういうわけかatan2を誤用していますか?

4

2 に答える 2

2

ypループの前ではなく、最初のループ内でリセットする必要があります。

int xp = -32;
for (int x = 0; x < 64; x++, xp++)
{
    int yp = -32; // Note, needs to be reset each time x changes.
    for (int y = 0; y < 64; y++, yp++)
    {
于 2012-07-13T14:43:35.790 に答える
1

Nit: atan2() は常に [-pi,pi] の角度を返します。2 番目の if ステートメントは冗長です。また、設計が悪い可能性もあります。後で [pi,2pi] の角度をテストしたい場合がよくあります。これは、デフォルトの範囲の単純な <0 で実行できます。基本的に、atan2() はあなたの友達です。この関数が存在する理由は、角度のモジュラー計算を行う手間からあなたを救うためです。

于 2012-07-13T15:57:02.737 に答える