改进代码void myDisplay(void){ int x=5; GLfloat point[x][2]={ {-a/2,a/2},{-3*a/2,3*a/2},{-3*a/2,-a/2}, {a/2,-a/2},{a/2,3*a/2} };
时间: 2023-05-28 12:08:07 浏览: 100
改进代码如下:
void myDisplay(void) {
int x = 5;
GLfloat point[][2] = {{-a/2,a/2},{-3*a/2,3*a/2},{-3*a/2,-a/2},{a/2,-a/2},{a/2,3*a/2}};
glBegin(GL_POLYGON);
for(int i = 0; i < x; i++) {
glVertex2fv(point[i]);
}
glEnd();
glFlush();
}
改进点:
1. 将数组大小声明为常量,避免程序运行时动态分配内存,提高效率。
2. 将数组声明时省略第一维的大小,由编译器自动推导。
3. 将绘制多边形的代码放在函数中,使代码结构更清晰,易于理解。
4. 使用 glVertex2fv() 函数来简化代码,避免重复代码。
相关问题
//By:ZHangFY #include <GL/glut.h> GLfloat rotate_angle1 = 0.0; GLfloat dSize = 0.3; //立方体大小 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(rotate_angle1, -0.3, 0.3, -0.3);//旋转点 glBegin(GL_QUADS); //上 glColor3f(0.0, 1.0, 0.0); //绿 glNormal3d(0.0, 0.0, 1.0); //上 glVertex3d(dSize, dSize, dSize); glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, -dSize, dSize); glVertex3d(dSize, -dSize, dSize); //下 glColor3f(0.0, 0.0, 1.0); //蓝 glNormal3d(0.0, 0.0, -1.0);//下 glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(dSize, -dSize, -dSize); //前 glColor3f(1.0, 0.0, 0.0); //红 glNormal3d(1.0, 0.0, 0.0);//前 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(dSize, dSize, -dSize); //后 glColor3f(0.0, 1.0, 1.0); //青 glNormal3d(-1.0, 0.0, 0.0);//后 glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //左 glColor3f(1.0, 0.0, 1.0); //品红 glNormal3d(0.0, -1.0, 0.0);//左 glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //右 glColor3f(1.0, 1.0, 0.0); //黄 glNormal3d(0.0, 1.0, 0.0);//右 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, dSize, dSize); rotate_angle1 += 3; glEnd(); glFlush(); glutSwapBuffers(); } void myIdle(void) { myDisplay(); //Sleep(20); //减慢旋转速度 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("立方体旋转MODEL"); glutDisplayFunc(&myDisplay); glutIdleFunc(&myIdle); glutMainLoop(); return 0; }
这段代码使用 OpenGL 绘制了一个可以旋转的立方体。其中,glRotatef() 函数用于旋转立方体,glBegin() 和 glEnd() 函数用于开始和结束绘制图形的过程,glVertex3d() 函数用于指定顶点坐标,glColor3f() 函数用于指定颜色,glNormal3d() 函数用于指定法向量。myIdle() 函数用于控制旋转速度。你可以编译运行这段代码,看看绘制的立方体是如何旋转的。
帮我注释以下代码#include <GL/glut.h> #include <math.h> GLfloat theta = 0; void init() { glClearColor(1.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); gluOrtho2D(-2.0, 2.0, -2.0, 2.0); glMatrixMode(GL_MODELVIEW); } void mydraw() { glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glEnd(); } void Mydisplay(void) { glClear(GL_COLOR_BUFFER_BIT); void glPushMatrix(void); mydraw(); void glPopMatrix(void); void glPushMatrix(void); glRotatef(theta, 0.0, 0.0, 1.0); mydraw(); void glPopMatrix(void); void glPushMatrix(void); glRotatef(theta, 0.0, 0.0, 1.0); mydraw(); void glPopMatrix(void); void glPushMatrix(void); glRotatef(theta, 0.0, 0.0, 1.0); mydraw(); void glPopMatrix(void); glFlush(); } void MyIdle(void) { theta += 15; if (theta >= 360) theta = 0; glutPostRedisplay(); } void reshape(int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)width / (GLfloat)height, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -3.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("动画"); init(); glutDisplayFunc(Mydisplay); glutReshapeFunc(reshape); glutIdleFunc(&MyIdle); glutMainLoop(); return 0; }
注释如下:
```c
#include <GL/glut.h> // 引入 OpenGL 库
#include <math.h>
GLfloat theta = 0; // 初始化旋转角度为 0
void init() {
// 设置背景颜色为红色
glClearColor(1.0, 0.0, 0.0, 0.0);
// 设置阴影模式为平滑
glShadeModel(GL_SMOOTH);
// 设置投影矩阵为 2D 正交投影
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-2.0, 2.0, -2.0, 2.0);
// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
}
void mydraw() {
// 绘制一个三角形
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0); // 设置顶点颜色为红色
glVertex3f(0.0, 1.0, 0.0); // 设置第一个顶点
glColor3f(0.0, 1.0, 0.0); // 设置顶点颜色为绿色
glVertex3f(0.0, 0.0, 0.0); // 设置第二个顶点
glColor3f(0.0, 0.0, 1.0); // 设置顶点颜色为蓝色
glVertex3f(0.5, 0.5, 0.0); // 设置第三个顶点
glEnd(); // 结束绘制
}
void Mydisplay(void) {
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
glPushMatrix(); // 压入当前矩阵
mydraw(); // 绘制一个三角形
glPopMatrix(); // 弹出当前矩阵,恢复之前的矩阵
glPushMatrix(); // 压入当前矩阵
glRotatef(theta, 0.0, 0.0, 1.0); // 绕 z 轴旋转 theta 度
mydraw(); // 绘制一个三角形
glPopMatrix(); // 弹出当前矩阵,恢复之前的矩阵
glPushMatrix(); // 压入当前矩阵
glRotatef(theta, 0.0, 0.0, 1.0); // 绕 z 轴旋转 theta 度
mydraw(); // 绘制一个三角形
glPopMatrix(); // 弹出当前矩阵,恢复之前的矩阵
glPushMatrix(); // 压入当前矩阵
glRotatef(theta, 0.0, 0.0, 1.0); // 绕 z 轴旋转 theta 度
mydraw(); // 绘制一个三角形
glPopMatrix(); // 弹出当前矩阵,恢复之前的矩阵
glFlush(); // 刷新缓冲区
}
void MyIdle(void) {
theta += 15; // 每次增加 15 度
if (theta >= 360) theta = 0; // 如果旋转角度大于等于 360 度,就重置为 0 度
glutPostRedisplay(); // 标记窗口需要重新绘制
}
void reshape(int width, int height) {
glViewport(0, 0, (GLsizei)width, (GLsizei)height); // 设置视口大小
glMatrixMode(GL_PROJECTION); // 设置投影矩阵
glLoadIdentity(); // 重置当前矩阵为单位矩阵
gluPerspective(60.0, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // 设置透视投影矩阵
glMatrixMode(GL_MODELVIEW); // 设置模型视图矩阵
glLoadIdentity(); // 重置当前矩阵为单位矩阵
glTranslatef(0.0, 0.0, -3.0); // 将模型沿 z 轴方向平移 -3 个单位
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化 GLUT 库
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置窗口的显示模式
glutInitWindowSize(500, 500); // 设置窗口大小
glutInitWindowPosition(100, 100); // 设置窗口位置
glutCreateWindow("动画"); // 创建窗口
init(); // 初始化 OpenGL 状态
glutDisplayFunc(Mydisplay); // 设置窗口绘制回调函数
glutReshapeFunc(reshape); // 设置窗口大小变化回调函数
glutIdleFunc(&MyIdle); // 设置闲置回调函数
glutMainLoop(); // 进入主循环
return 0;
}
```
阅读全文