我正在尝试在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();
}
}
}
}
答案 0 :(得分:3)
如果您的列数为奇数,则黑色与白色的“奇数与偶数”将与您的偶数相比有所不同。我认为最简单的方法是为所有Squares做一个循环,并保持在每个循环结束时设置为bool white_or_black
的{{1}}变量。
还有大量重复的代码可以通过一个循环而不是两个循环来简化。
[我不是100%确定你的代码出了什么问题,所以我不确定这是否能解决这个问题 - 但我相信这是一个值得改进的地方]。
答案 1 :(得分:1)
首先了解您的问题。你必须绘制奇数vs甚至黑色vs白板,这意味着在第一行,如果你绘制奇数白板,那么你必须绘制甚至黑板,在下一行甚至白板和奇怪的黑板。对于完成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();
}
答案 2 :(得分:0)
我怀疑“宽度不会变为5”,你的宽度是4或6.这是正确的吗?在这种情况下,由于双精度算术,很可能是一个错误。
你知道,你在循环中假设无限精确,但可以想象5*1.5
与添加1.5
五次不同。
你应该做的是从1到5(或0到4)的整数循环,然后将该值乘以你的平方大小以产生坐标。除非你知道自己在做什么以及会发生什么,否则循环双打通常不是一个好主意。
你应该做的另一件事是使用常量而不是文字。而不是使用数字5
来编写代码,为什么不定义:
const int BoardWidth = 5;
const int BoardHeight = 5;
然后更改会更容易。
答案 3 :(得分: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();
}
这可能不会起作用,但它应该给你一个起点。