计算机图形图像练习题与解答(源码+注释)

老子叫甜甜 提交于 2020-02-27 02:33:37

计算机图形图像练习题与解答(源码+注释)

记录一下作业题解,附上详细注释。

3-3 白色正方形

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 <windows.h>
#include<GL/glut.h>
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 红色正三角形

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 <windows.h>
#include<GL/glut.h>
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 蓝色四边形

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 <windows.h>
#include<GL/glut.h>
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 点的反走样

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 <windows.h>
#include<GL/glut.h>
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 线段的反走样

3-7 请使用OpenGL和GLUT编写一个简单的图形程序,用于演示线段的反走 样效果。其中线段的端点为(-0.6, -0.3)和(0.6, 0.3),线宽为4.5像素,程序窗口的大 小为(200, 200),标题为“线段的反走样”。

#include <windows.h>
#include <GL/glut.h>
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 多视口演示1

3-8 请使用OpenGL、GLU和GLUT编写一个简单的多视口演示程序。要求: ① 在屏幕窗口左侧的1/2部分显示一个红色的填充矩形,该矩形的一对对角顶点是 (-0.8, -0.8)和(0.8, 0.8);② 在屏幕窗口右侧的1/2部分显示一个蓝色的填充犹他茶 壶,茶壶半径为0.6;③ 程序窗口的大小为(400, 200),背景为黑色,标题为“多视口演示”。

#include <windows.h>
#include <gl/glut.h>
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 多视口演示2

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 <windows.h>
#include <gl/glut.h>
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(); // 开始执行
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!