0

OpenGL で 5x5 チェス盤を作成しようとしています。私は 5x6 と 8x8 を設計できましたが、コードは 5x5 では機能しません。誰かがコードを見て、幅が5に変わらないので私の間違いを指摘できますか?

問題があると思われるコードの一部を次に示します。

void drawScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(-2.5*1.5, 0.0, 2.5*1.5);

    for(double j=0.0;j>(-5*1.5);j-=1.5)
    {
        k++;
        for(i=0.0;i<(2.5*3.0);i+=3.0)
        {
            if(k%2!=0)
            {
                glPushMatrix();
                glTranslatef(i,0.0,j);
                glCallList(_displayListId_blackArea);
                glPopMatrix();

            }
            else
            {
                glPushMatrix();
                glTranslatef(i+1.5,0.0,j);
                glCallList(_displayListId_blackArea);
                glPopMatrix();

            }
        }
    }
    for(double j=0.0;j>(-5*1.5);j-=1.5)
    {
        k++;
        for(i=0.0;i<(2.5*3.0);i+=3.0)
        {
            if(k%2!=0)
            {
                glPushMatrix();
                glTranslatef(i,0.0,j);
                glCallList(_displayListId_whiteArea);
                glPopMatrix();

            }
            else
            {
                glPushMatrix();
                glTranslatef(i+1.5,0.0,j);
                glCallList(_displayListId_whiteArea);
                glPopMatrix();
            }
        }
    }
}
4

4 に答える 4

3

奇数の列がある場合、黒と白の「奇数と偶数」は、偶数の場合とは異なります。最も簡単な方法は、すべての正方形に対して 1 つのループを実行し、各ループの最後にbool white_or_black設定されている変数を保持することだと思います。white_or_black = !white_or_black

2 つではなく 1 つのループを使用することで、はるかに単純化できる重複コードも大量にあります。

[あなたのコードのどこが間違っているのか 100% 確信が持てないので、これで実際に問題が解決するかどうかはわかりませんが、価値のある改善だと思います].

于 2013-02-11T22:20:03.317 に答える
1

最初に問題を理解してください。黒対ホワイトボードの場合は奇数対偶数を描画する必要があります。つまり、最初の行で奇数のホワイトボードを描画する場合は、偶数のブラックボードを描画し、次の行では偶数のホワイトボードと奇数のブラックボードを描画する必要があります。白と黒のボードの列ごとに5*5のチェス盤パターンを完成させるために以下に示します。

3*2
2*3
3*2
2*3
3*2

ただし、提供するコードは同じ数の白と黒のボード用であるため、ロジックを変更する必要があります。これは、ロジックを使用して5 * 5のチェス盤を描画したコードの一部であり、完全に機能します。

for(float j=0.0;j>(-5*1.5);j-=1.5)
{
k++;
//for(i=0.0;i<(4*3.0);i+=3.0)
//{
if(k%2==0)
{
for(i=0.0;i<(3*3.0);i+=3.0){
 glPushMatrix();
 glTranslatef(i,0.0,j);
 glCallList(_displayListId_blackArea);
 glPopMatrix();
 }

}
else
{
  for(i=0.0;i<(2*3.0);i+=3.0){
glPushMatrix();
glTranslatef(i+1.5,0.0,j);
glCallList(_displayListId_blackArea);
glPopMatrix();
}

}
 //}
}
k=0;
for(float j=0.0;j>(-5*1.5);j-=1.5)
{
k++;
  //for(i=0.0;i<(4*3.0);i+=3.0)
 //{
 if(k%2!=0)
 {
     for(i=0.0;i<(3*3.0);i+=3.0){
glPushMatrix();
glTranslatef(i,0.0,j);
glCallList(_displayListId_whiteArea);
glPopMatrix();
  }

}
  else
 {
    for(i=0.0;i<(2*3.0);i+=3.0){
  glPushMatrix();
  glTranslatef(i+1.5,0.0,j);
  glCallList(_displayListId_whiteArea);
  glPopMatrix();
  }

}
}
k=0;
glutSwapBuffers();
}
于 2013-02-12T05:51:27.970 に答える
0

「幅が 5 に変わらない」ということで、幅が 4 または 6 になっていると思われますが、正しいでしょうか。その場合、倍精度演算が原因でエラーになる可能性が非常に高くなります。

ご覧のとおり、ループで無限の精度を想定していますが、 5 回5*1.5追加するのと同じではないことはかなり考えられます。1.5

実際にすべきことは、1 から 5 (または 0 から 4) の整数ループを作成し、その値に平方サイズを掛けて座標を生成することです。自分が何をしているのか、何が起こり得るのかを理解していない限り、double をループすることは一般的には良い考えではありません。

リテラルの代わりに定数を使用することをお勧めします。コードに number を追加する代わりに、次のように5定義してください。

const int BoardWidth = 5;
const int BoardHeight = 5;

その後、変更するのははるかに簡単になります。

于 2013-02-11T22:20:48.530 に答える
0

そのコードは忘れてください。潜在的な可能性が低いため、int をカウンターとして使用してボードを作成する必要があります。例えば:

const unsigned BOARD_SIZE = 5;

for(unsigned i = 0; i < BOARD_SIZE; ++i){
 for(unsigned j = 0; j < BOARD_SIZE; ++j){
    drawBoardCell(i,j, (i*BOARD_SIZE + j) % 2 == 0);
  }
}

void drawBoardCell(const int row, const int col, const bool isBlack){
  glPushMatrix();
  glTranslatef(col+1.5,0.0,row);
  const int callId = isBlack ? _displayListId_blackArea : _displayListId_whiteArea;
  glCallList(callId);
  glPopMatrix();
}

最初はうまくいかないかもしれませんが、出発点になるはずです。

于 2013-02-11T22:26:03.673 に答える