记录一下作业题解,附上详细注释。
3-3 请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的 白色正方形。其中正方形的左下角顶点是(-0.8, -0.8),右下角顶点是(0.8, -0.8),程 序窗口的大小为(200, 200),标题为“白色正方形”。
使用glRectf函数定义一个矩形,函数原型为:
void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
(x1, y1)左下角顶点的坐标。 (x2, y2)右上角顶点的坐标。
题中有正方形左下角顶点是(-0.8, -0.8),右下角顶点是(0.8, -0.8),所以右上角为(0.8, 0.8)
即glRectf(-0.8,-0.8,0.8,0.8),完整代码为:
#include
#include
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
glRectf(-0.8,-0.8,0.8,0.8);//定义左下角坐标为(-0.8, -0.8),右上角为(0.8, 0.8)的矩形
glFlush();//强制OpenGL命令序列在有限的时间内完成执行
}
int main()
{
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("白色正方形");//窗口标题
glutDisplayFunc(Paint);//指定场景绘制函数
glutMainLoop();// 开始执行
}
3-4 请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的 红色正三角形。其中正三角形的左下角顶点是(-0.5, 0),右下角顶点是(0.5, 0),程 序窗口大小为(200, 200),标题为“红色正三角形”。
由题,正三角形的左下角顶点是(-0.5, 0),右下角顶点是(0.5, 0),可求得正三角上顶点坐标(0, 0.86)使用函数void glVertex2d指定这个正三角的三个顶点坐标,该函数函数只有在glBegin()与glEnd()之间调用才有效。
#include
#include
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
glColor3f(1,0,0);//设置图形颜色为红色
glBegin(GL_TRIANGLES);//基本图元定义的开始,GL_TRIANGLES表示把每三个顶点作为一个独立的三角形
glVertex2d(-0.5,0),glVertex2d(0.5,0),glVertex2d(0,0.8);//指定该正三角形的三个顶点坐标
glEnd();//基本图元定义的结束
glFlush();//强制OpenGL命令序列在有限的时间内完成执行
}
int main()
{
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("红色正三角形");//窗口标题
glutDisplayFunc(Paint);//指定场景绘制函数
glutMainLoop();// 开始执行
}
3-5 请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的 蓝色四边形。其中四边形的4个顶点分别是(-0.8, -0.8)、(0.5, -0.8)、(0.8, 0.8)和(-0.5, 0.8),程序窗口的大小为(200, 200),背景为白色,标题为“蓝色四边形”。
使用函数void glVertex2d指定这个蓝色四边形的四个顶点坐标,该函数函数只有在glBegin()与glEnd()之间调用才有效。
#include
#include
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
glColor3f(0,0,1);//设置图形颜色为蓝色
glBegin(GL_QUADS);//基本图元定义的开始,GL_QUADS表示把每四个顶点作为一个独立四边形
glVertex2d(-0.8,-0.8),glVertex2d(0.5,-0.8),glVertex2d(0.8,0.8),glVertex2d(-0.5,0.8);
//指定该蓝色四边形的四个顶点坐标
glEnd();//基本图元定义的结束
glFlush();//强制OpenGL命令序列在有限的时间内完成执行
}
int main()
{
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("蓝色四边形");//窗口标题
glutDisplayFunc(Paint);//指定场景绘制函数
glutMainLoop();// 开始执行
}
3-6 请使用OpenGL和GLUT编写一个简单的图形程序,用于演示点的反走64 样效果。要求使用线段(-0.6, -0.6)~(0.6, 0.6)上均匀分布的5个点(含端点),点的 大小为10.5像素,程序窗口的大小为(200, 200),标题为“点的反走样”。 均匀分布的5个点(含端点),所以该5点的坐标分别为:(-0.6, -0.6),(-0.3, -0.3),(0, 0),(0.3, 0.3),(0.6, 0.6)
#include
#include
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
glBegin(GL_POINTS);//基本图元定义的开始,POINTS表示把每一个顶点作为一个独立的点。
double i;
for(i=-0.6; i<=0.6; i+=0.3)
glVertex2f(i,i);//从下至上指定二维顶点坐标
glEnd();//基本图元定义的结束
glFlush();//强制OpenGL命令序列在有限的时间内完成执行
}
int main()
{
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("点的反走样");//窗口标题
glutDisplayFunc(Paint);//指定场景绘制函数
glPointSize(10.5);//以像素为单位设置点的宽度,默认1.0,必须大于0
glEnable(GL_POINT_SMOOTH);//启用点的反走样
glutMainLoop();// 开始执行
}
3-7 请使用OpenGL和GLUT编写一个简单的图形程序,用于演示线段的反走 样效果。其中线段的端点为(-0.6, -0.3)和(0.6, 0.3),线宽为4.5像素,程序窗口的大 小为(200, 200),标题为“线段的反走样”。
#include
#include
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
glBegin(GL_LINES);//基本图元定义的开始,POINTS表示把每一个顶点作为一个独立的点。
glVertex2f(-0.6, -0.3),glVertex2f(0.6, 0.3);//从下至上指定二维顶点坐标
glEnd();//基本图元定义的结束
glFlush();//强制OpenGL命令序列在有限的时间内完成执行
}
int main()
{
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("线段的反走样");//窗口标题
glutDisplayFunc(Paint);//指定场景绘制函数
glLineWidth(4.5);//以像素为单位设置线的宽度
glEnable(GL_LINE_SMOOTH);//启用线的反走样
glutMainLoop();// 开始执行
}
3-8 请使用OpenGL、GLU和GLUT编写一个简单的多视口演示程序。要求: ① 在屏幕窗口左侧的1/2部分显示一个红色的填充矩形,该矩形的一对对角顶点是 (-0.8, -0.8)和(0.8, 0.8);② 在屏幕窗口右侧的1/2部分显示一个蓝色的填充犹他茶 壶,茶壶半径为0.6;③ 程序窗口的大小为(400, 200),背景为黑色,标题为“多视口演示”。
#include
#include
void Viewport(int x, int y, int w, int h)
{
glViewport(x, y, w, h); // 定义视口
glLoadIdentity(); // 消除其他视口的影响, 函数介绍见后续章节
}
void Paint()
{
int w = glutGet(GLUT_WINDOW_WIDTH) /2; // 计算视区宽度
int h = glutGet(GLUT_WINDOW_HEIGHT) ; // 计算视区高度
glClearColor(0, 0, 0, 0); // 黑色背景
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
Viewport(0, 0, w, h); // 左下方视口
glColor3f(1, 0, 0); // 设置当前颜色, 红色
glRectf(-0.8, -0.8, 0.8, 0.8); // 定义正方形
Viewport(w, 0, w, h); // 右下方视口
glColor3f(0, 0, 1); // 设置当前颜色, 绿色
glutSolidTeapot(0.6); // 定义犹他茶壶
glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); // 初始化GLUT, 记录main()函数的参数
glutInitWindowSize(400,200);//窗口的大小
glutCreateWindow("多视口演示");//窗口标题
glutDisplayFunc(Paint); // 指定场景绘制函数
glutMainLoop(); // 开始执行
}
3-9 请使用OpenGL、GLU和GLUT编写一个多视口演示程序。要求:① 在屏 幕窗口左下角的1/4部分显示一个红色的填充矩形,该矩形的一对对角顶点是(-0.8, -0.8)和(0.8, 0.8);② 在屏幕窗口右下角的1/4部分显示一个绿色的填充犹他茶壶, 茶壶半径为0.6;③ 在屏幕窗口上部居中的1/4部分显示一个蓝色的填充三角形,该三角形的顶点分别是(-0.8, -0.8)、(0.8, -0.8)和(0, 0.8);④ 程序窗口的大小为(200, 200),背景为黑色,标题为“多视口演示”。
#include
#include
void Viewport(int x, int y, int w, int h)
{
glViewport(x, y, w, h); // 定义视口
glLoadIdentity(); // 消除其他视口的影响, 函数介绍见后续章节
}
void Paint()
{
int w = glutGet(GLUT_WINDOW_WIDTH) / 2; // 计算视区宽度
int h = glutGet(GLUT_WINDOW_HEIGHT) / 2; // 计算视区高度
glClearColor(1, 1, 1, 1); // 白色背景
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
Viewport(0, 0, w, h); // 左下方视口
glColor3f(1, 0, 0); // 设置当前颜色, 红色
glRectf(-0.8, -0.8, 0.8, 0.8); // 定义正方形
Viewport(w, 0, w, h); // 右下方视口
glColor3f(0, 1, 0); // 设置当前颜色, 绿色
glutSolidTeapot(0.6); // 定义犹他茶壶
Viewport(w/2, h, w, h); // 上部居中视口
glColor3f(0,0,1);//设置图形颜色为蓝色
glBegin(GL_TRIANGLES);//基本图元定义的开始,GL_TRIANGLES表示把每三个顶点作为一个独立的三角形
glVertex2d(-0.8, -0.8),glVertex2d(0.8, -0.8),glVertex2d(0,0.8);//指定该正三角形的三个顶点坐标
glEnd();//基本图元定义的结束
glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); // 初始化GLUT, 记录main()函数的参数
glutInitWindowSize(200,200);//窗口的大小
glutCreateWindow("多视口演示");//窗口标题
glutDisplayFunc(Paint); // 指定场景绘制函数
glutMainLoop(); // 开始执行
}