我的代码工作正常,但是当我调整输出 window 大小时,屏幕上的地面失真了。我该如何解决?

My code works correctly but when I resize the output window, ground on the sceen is distorted. How can I fix it?

我的代码工作正常,但是当我调整输出大小时 window,屏幕上的地面失真了。我该如何解决?正确的输出是 below.When 我调整输出的大小 window,它变成如下图所示。 正确的输出如下。

我的代码如下:

#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>

int x = 0;
int z = 0;
int y;
int data[17][21] =
{ { 14 ,25, 45 ,55 ,68 ,70 ,84 ,91 ,97, 101 ,105 ,105 ,105, 105 ,110 ,110,  110, 110 ,110, 110, 110 },
{ 5, 18, 43, 62 ,73, 82, 88, 94, 99, 102 ,105, 105 ,105, 105, 110, 110 ,110 ,110 ,110, 110, 110 },
{ 5, 18 ,38 ,56, 69, 77, 86, 94, 99, 103, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 },
{ 5 ,9 ,31, 48, 60, 71, 81, 87, 95, 101, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 },
{ 5, 5, 18, 37, 49, 56, 62, 81, 91, 94, 101, 105, 105, 105, 110, 110, 110 ,110 ,110, 110, 110 },
{ 5, 5, 12, 23 ,34, 40, 53 ,66 ,77 ,82, 97, 103, 105, 105, 109, 110, 110, 110, 110, 115, 115 },
{ 4 ,5 ,8 ,15, 20, 24, 35, 39, 40, 77, 92, 101, 104, 104 ,105, 110, 110, 110, 115, 115, 115 },
{ 5, 7 ,22, 36, 46, 48, 48, 44 ,50, 58, 80, 96, 96, 97, 106, 110, 110, 115, 115, 115, 115 },
{ 4, 15 ,31 ,46 ,61, 68, 69, 63, 53, 50, 67, 82, 84, 103, 108, 110, 110, 115, 115, 115, 115 },
{ 4, 12, 31, 46, 64, 78, 82, 80, 69, 54, 73, 71, 92, 105, 108, 110, 110, 115, 115, 115, 115 },
{ 6, 26 ,35 ,45, 63, 75, 84, 87, 84, 74 ,77, 80, 96, 103, 108, 110, 110, 110, 115, 115, 115 },
{ 21, 30, 46, 57 ,64 ,76 ,85 ,92 ,92, 87 ,79 ,80 ,86 ,102, 106, 110, 105 ,110, 115, 115, 115 },
{ 27, 40, 48 ,62 ,75 ,84 ,92, 96, 97 ,94 ,88 ,80 ,80 ,91, 104, 105, 105, 105, 110, 115, 115 },
{ 33, 43, 55, 65, 75, 87, 96, 101, 101, 101, 97, 92, 80, 80, 98, 105, 105, 105, 105, 110, 115 },
{ 45, 50, 58, 68, 80, 91, 99, 102, 105, 105, 105, 99, 90, 80, 80, 97, 105, 105, 105, 110, 100 },
{ 50, 60, 65, 71, 84, 95, 101, 105, 105, 107, 107, 106, 102, 101, 92, 80, 98, 104, 105, 100, 100 },
{ 60, 70, 76, 83, 88 ,96, 103, 106 ,107, 108 ,110, 109 ,108 ,108, 106, 101 ,90, 100, 100, 100, 100 } };
//bool tamam=true;
void display(void)
{
int type = GL_TRIANGLES;  // or GL_LINE_LOOP
glLoadIdentity();
gluLookAt(350, 600, 400, 280, 300, 300, 0, 0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Sides of the cube as loops or polygons, in anti-clockwise order.

//glColor3f(1.0, 1.0, 1.0);
glBegin(type);
for (int i = 0; i < 16; i++)
{
    x = 0;

    for (int k = 0; k < 20; k++)
    {
        y = data[i][k];
        if (y >= 80)
            glColor3f(1.0, 0.0, 0.0);
        if (y>0 && y<50)
            glColor3f(0.0, 1.0, 0.0);
        if (y >= 50 && y<80)
            glColor3f(1.0, 1.0, 0.0);



        glVertex3f(x, data[i][k], z);
        glVertex3f(x, data[i + 1][k], z + 20);
        glVertex3f(x + 20, data[i + 1][k + 1], z + 20);


        x = x + 20;

    }


    z = z + 20;

}

z = 0;

for (int i = 0; i < 16; i++)
{

    x = 0;


    for (int k = 0; k < 20; k++)
    {
        y = data[i][k];
        if (y>0 && y<50)
            glColor3f(0.0, 1.0, 0.0);
        if (y >= 50 && y<80)
            glColor3f(1.0, 1.0, 0.0);
        if (y >= 80)
            glColor3f(1.0, 0.0, 0.0);


        glVertex3f(x + 20, data[i + 1][k + 1], z + 20);//z*i
        glVertex3f(x + 20, data[i][k + 1], z);
        glVertex3f(x, data[i][k], z);



        x = x + 20;

    }


    z = z + 20;

}


glEnd();  // front

          /*if(tamam)*/

          /*tamam=false;*/

glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: case 'q': case 'Q':
    exit(EXIT_SUCCESS);
    break;
}
} 
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(1200, 720);
glutCreateWindow(argv[0]);
glViewport(0, 0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(300, glutGet(GLUT_WINDOW_WIDTH) /                 

glutGet(GLUT_WINDOW_HEIGHT), 0.0, 300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
//glutReshapeFunc(reshape);
//glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}

我该如何解决?? 感谢您的帮助...

不知是不是因为调用gluPerspective时使用了整数除法。有点猜测。

这看起来像是索引错误。为什么 xyz(可能还有 i)是全局变量?很可能你让其中一个处于糟糕的状态,而下次你迭代你的数据时它会导致这种混乱。

顺便说一句:您应该强烈考虑放弃固定功能管道即时模式绘图。将您的 data 数组放入 VBO 中,构建一个索引数组,该数组将迭代它形成三角形(就像您目前所做的那样)并使用顶点着色器变量 gl_VertexID 以及指定统一的宽度来生成顶点的 xz 个位置。