圖形學的幾道基礎練習(計算機圖形學)
阿新 • • 發佈:2018-12-12
整理資料夾時發現曾經做的幾個作業練習,發出來和大家一起學習吧。
================================(題目①)=================================
在一個黑色的視窗中央畫出矩形、三角形、點和線。
踩坑記錄:一開始畫線部分,因為省略了glEnd(),導致生成影象時顯示空白視窗。
#pragma warning(disable:4996) #include<GL/glut.h> void myDisplay(void) { glClearColor(0.0, 0.0, 0.0, 0.0); //將清空顏色設為黑色 glClear(GL_COLOR_BUFFER_BIT); //將視窗的背景設定為:清空顏色 glColor3f(1.0f, 1.0f, 1.0f); //畫一個矩形 glRectf(-0.8f, -0.8f, 0.8, 0.8f); glBegin(GL_TRIANGLES); //畫兩個三角形 glColor3f(1.0f, 1.0f, 0.0f); glVertex2f(0.0f, -1.0f);//黃 glColor3f(1.0f, 0.0f, 1.0f); glVertex2f(0.8f, 0.5f);//品紅 glColor3f(0.0f, 1.0f, 1.0f); glVertex2f(-0.8f, 0.5f);//青 glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);//紅 glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.8f, -0.5f);//綠 glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.8f, -0.5f);//藍 glEnd(); glPointSize(10); //設定點的大小 glBegin(GL_POINTS); //畫7個點 glColor3f(1.0f, 1.0f, 0.0f); glVertex2f(0.0f, 0.7f);//黃 glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(0.0f, 0.0f);//白 glColor3f(0.0f, 1.0f, 1.0f); glVertex2f(0.53f, -0.33f);//青 glColor3f(1.0f, 0.0f, 1.0f); glVertex2f(-0.53f, -0.33f);//品紅 glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.53f, 0.33f);//藍 glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(-0.53f, 0.33f);//綠 glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, -0.7f);//紅 glEnd(); glBegin(GL_LINES);//線 glColor3f(0.0, 0.0, 0.0); glLineWidth(6);//線的寬度 glVertex2f(-0.8f, 0.5f); glVertex2f(0.8f, -0.5f); glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); glVertex2f(0.8f, 0.5f); glVertex2f(-0.8f, -0.5f); glEnd(); glFinish(); //強制前面的OpenGL命令立即執行,不駐留快取 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); //設定視窗在螢幕中的位置 glutInitWindowSize(400, 400); //設定視窗的大小 glutCreateWindow("Hello World!"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; }
================================(題目②)=================================
利用OpenGL實現直線光柵化的DDA演算法和Bresenham演算法。
#pragma warning(disable:4996) #include<math.h> #include <GL/glut.h> #include<cstdio> void LineDDA(int x0, int y0, int x1, int y1)/* LineDDA函式畫線 */ { int x, y, dx, dy; float m; dx = x1 - x0; dy = y1 - y0; m = dy / dx; y = y0; glColor3f(1.0f, 1.0f, 0.0f); glPointSize(1); for (x = x0;x <= x1;x++) { glBegin(GL_POINTS); glVertex2i(x, (int)(y + 0.5)); glEnd(); y += m; } } void Bresenhamline(int x0, int y0, int x1, int y1)/* Bresenham函式畫線 */ { int x, y, dx, dy; float e; dx = x1 - x0; dy = y1 - y0; e = -dx; x = x0; y = y0; for (int i = 0;i<dx;i++) { glBegin(GL_POINTS); glVertex2i(x, y); x++; e = e + 2 * dy; if (e >= 0) { y++; e = e - 2 * dx; } } } void myDisplayLine(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(25.0, 25.0, 75.0, 75.0); glPointSize(5); glBegin(GL_POINTS); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.0f, 0.0f); glEnd(); LineDDA(0, 0, 200, 300); //呼叫LineDDA函式畫線 glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(100.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(180.0f, 240.0f); glEnd(); glFlush(); } void myDisplayBres(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(25.0, 25.0, 75.0, 75.0); glPointSize(5); glBegin(GL_POINTS); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.0f, 0.0f); glEnd(); Bresenhamline(0, 0, 200, 300); //呼叫Bresenhamline函式畫線 glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(100.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(180.0f, 240.0f); glEnd(); glFlush(); } void Init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); } int main(int argc, char *argv[]) { int i; printf("請選擇實現直線光柵化的演算法:\n1.DDA\t2.Bresenham\n"); while (scanf("%d", &i)) { if (i == 1 || i == 2) break; else{} } glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("Hello World!"); Init(); if(i==1) glutDisplayFunc(myDisplayLine); //設定mydisplay函式,當需要進行畫圖時,這個函式就會被呼叫 else if(i==2) glutDisplayFunc(myDisplayBres); else return 0; glutReshapeFunc(Reshape); //呼叫此函式,重新建立用作新渲染畫布的矩形區域 glutMainLoop(); //進行一個訊息迴圈(現在只需要知道這個函式可以顯示視窗,並且等待視窗關閉才會返回) return 0; }
================================(題目③)=================================
畫頂點分別為A(1,1),B(2,5), C(6,3) 的三角形ABC,同時畫出繞B點逆時針旋轉90度的三角形A’B’C’,最後在以上基礎上再畫出繞B點順時針旋轉90度的三角形A’’B’’C’’。
#pragma warning(disable:4996) #include <GL/glut.h>; void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(-15.0, 15.0, -15.0, 15.0); //設定x、y顯示的範圍 glMatrixMode(GL_MODELVIEW); } void drawSquare(void) //繪製三角形 { glBegin(GL_TRIANGLES); //頂點指定需要按逆時針方向 glVertex2f(1.0f, 1.0f); glVertex2f(2.0f, 5.0f); glVertex2f(6.0f, 3.0f); glEnd(); } void myDraw(void) { glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //將當前矩陣設為單位矩陣 glPushMatrix(); //a:此處的push是為了表明堆疊當前狀態 glColor3f(1.0f, 0.0f, 0.0f); //紅色三角形 drawSquare(); //呼叫drawSquare glPopMatrix(); //這個pop使得堆疊狀態回到a狀態 glPushMatrix(); //作用同a,表明堆疊當前狀態 glTranslatef(7.0, 3.0, 0.0); //平移變換,x正方向平移7個單位,y正方向平移3個單位 glPushMatrix(); //c:這裡的push儲存了上面平移矩陣 glRotatef(90.0, 0.0, 0.0, 1.0); //旋轉變換,逆時針旋轉90° glColor3f(0.0f, 1.0f, 0.0f); drawSquare(); //綠色三角形,進行一個旋轉和一個平移變換 glPopMatrix(); //這個pop使得堆疊狀態回到c狀態,棧裡有(7.0, 3.0, 0.0) glTranslatef(-10.0, 4.0, 0.0); glPushMatrix(); //d:這裡的push儲存了上面平移矩陣,棧裡由底到頂有(7.0, 3.0, 0.0),(-10.0, 4.0, 0.0) glRotatef(-90.0, 0.0, 0.0, 1.0); //旋轉變換,順時針旋轉90° glColor3f(0.0f, 0.0f, 1.0f); drawSquare(); //藍色三角形,進行一個旋轉和一個平移變換 glFlush(); } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("Hello World !"); init(); glutDisplayFunc(myDraw); glutMainLoop(); }
✎﹏﹏₯㎕《晴天》re so so si la si la so la si si si si la si la so ...﹍﹍﹍﹍﹍﹍