計算機圖形圖像練習題與解答(源碼+註釋)
記錄一下作業題解,附上詳細註釋。
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(); // 開始執行
}