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

如果您有奇数列,则黑色与白色的“奇数与偶数”将与偶数列不同。我认为最简单的方法是对所有 Squares 执行一个循环,并在每个循环结束时保留一个bool white_or_black设置为的变量。white_or_black = !white_or_black

还有大量重复的代码可以通过一个循环而不是两个循环来变得更简单。

[我不是 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*1.5与添加1.5五次不同。

您真正应该做的是有一个从 1 到 5(或 0 到 4)的整数循环,然后将该值乘以您的平方大小以产生坐标。除非您知道自己在做什么以及会发生什么,否则循环双打通常不是一个好主意。

您应该做的另一件事是使用常量而不是文字。与其在代码中添加数字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 回答