2

私は openGL プロジェクトに取り組んでいますが、rand 関数が十分なランダム範囲を与えてくれません。私は、1 つのダイヤモンドが画面の中央に配置され、5 つのダイヤモンドが画面の他の場所にランダムに配置されるダイヤモンド プログラムを作成する任務を負っています。何が起こっているのかというと、私の中心のひし形は本来あるべき場所にあり、他の 5 つのひし形は中心から左の小さな範囲でランダムに集まっています。ダイヤモンドを描画する関数を含めました。

void myDisplay(void)
{
srand(time(0));

GLintPoint CenterPoint;
int const size = 20;

CenterPoint.x = screenWidth / 2;
CenterPoint.y = screenHeight / 2;

glClear(GL_COLOR_BUFFER_BIT);

drawDiamond(CenterPoint, size);

for (int i = 0; i < 5; i++)
{
    GLfloat x = rand() % 50 + 10;
    GLfloat y = rand() % 200 + 100;
    GLfloat size = rand() % 100;
    GLintPoint diam = {x,y};
    drawDiamond(diam, size);
}

さらにコードが必要な場合はお知らせください。編集します。これを修正する方法について誰かアイデアがありますか? 私は rand() 関数の数を「いじり」ましたが、実際にはあまり効果がないようです。それらはまだ画面上のさまざまなポイントに集まっているように見えます. 助けてくれてありがとう。誰かが知る必要がある場合に備えて、私はこれを VS2012 で作成しています。

4

2 に答える 2

2

WhozCraig が述べたように、呼び出すたびに乱数ジェネレーターに時間をシードするのmyDisplay (...)は悪い考えです。これはtime (NULL)、 の粒度が 1 秒であり、リアルタイム グラフィックスでは通常、1 秒間に複数回シーンを描画するためです。myDisplay (...)したがって、経過時間が 1 秒未満のときに呼び出すたびに、同じ一連の乱数を繰り返します。

また、 の呼び出しでモジュロ演算を使用するrand (...)と、返される値の品質に悪影響を及ぼします。これは、発生する数の確率分布を変更するためです。推奨される手法はrand (...)、float にキャストしてから RAND_MAX で除算し、この結果に目的の範囲を掛けることです。

GLfloat x = rand() % 50 + 10; /* <-- Bad! */

/* Consider this instead */
GLfloat x = (GLfloat)rand () / RAND_MAX * 50.0f + 10.0f;

とはいえ、考えてみてください。GLfloat2 行後に整数データ構造に格納する場合、なぜ x と y に使用するのですか?

于 2013-09-08T23:26:45.087 に答える