計算機圖形圖像練習題與解答(源碼+註釋)

計算機圖形圖像練習題與解答(源碼+註釋)

記錄一下作業題解,附上詳細註釋。

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(); // 開始執行
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章