0

空間の基準点の周りに一定間隔のドアの円を作成する必要があります。プログラムを実行するたびに、異なる数のアイテムが円の中に表示されるため、増加したアイテム数に対応するために自動的に再スケーリングされます。これはプログラミングの質問というよりは数学の質問の方が多いことは知っていますが、困惑しています。次のコードは私が得たものと同じくらい近いです:

block->setPosition(core::vector3df(sin(segdeg*itemnumber)*radius+referencepoint.X,
                                   0,
                                   cos(segdeg*itemnumber)*radius+referencepoint.Z));

ブロックはオブジェクトであり、このコードはアイテムごとに実行されます。segdegは360/アイテムの数です。つまり、SEGmentDEGreesです。半径は、アイテムが必要な中心点からどれだけ離れているかです。Itemnumberは、問題のアイテムのインデックスです-それがどの番号のアイテムであるか。

何らかの理由で、このコードは各ドアをかなり閉じますが、それでも約10〜15度ずれています。(ただし、最初のドアは常にスポットになっています)ただし、アイテムはすべて中心点から正しい距離にあります。これは本当に明白な答えの質問だと確信していますが、私は何時間もそれを解決することができず、私は私のお尻をグーグルで検索しました。

誰かが私のアルゴリズムを修正できますか?

4

2 に答える 2

2

sincos度ではなくラジアンで引数を取ります。( SEGment segrad = 2 * pi / the_number_of_itemsDEGrees)の代わりにsegdeg = 360.0 / the_number_of_items(SEGment RADians)が必要です。

実装はpiの値を提供する場合がありますが、標準には値がないためboost::math::constants::pi<double>()、独自の値を使用または配置する必要がある場合があります。

いずれの場合も0は0であるため、最初の項目は正しいです。

于 2012-05-28T10:14:45.587 に答える
2
int doors = 5;
double rotation = 2 * M_PI / doors;
for(int door = 0; door < doors; ++door)
{
    double door_rotation = door * rotation;
    double door_x = reference_x + cos(door_rotation);
    double door_y = reference_y + sin(door_rotation);
}
于 2012-05-28T10:51:43.403 に答える