一、實驗名稱:五角星的繪制
二、實驗目的:了解 OpenGL 程序設計結構,掌握編程環
三、境的設置,掌握繪制線段的方法。
四、實驗內容:
1.在 VC++ 環境下 ,練習利用 OpenGL 繪制三角形的程序。
2.編程實現繪制一個五角星。(傳統 OpenGL 或者 Shader)
五、實驗所需基本函數
1.線段繪制
glBegin(GL_LINES);//繪制參數GL_LINES glVertex2f(30,30);//起始點坐標 glVertex2f(100,100);//終點坐標(兩個為一組) glEnd();
2.填充圖像
glBegin(GL_POLYGON);//繪制參數GL_POLYGON
glVertex2f(x0, y0);//頂點坐標1
glVertex2f(x1, y1);//2
glVertex2f(cx, cy);//3
glEnd();
結果為對三個頂點組成的圖像進行填充
3.繪制顏色設置
glColor3f(0.92, 0.89, 0.41);//金黃色
六、實驗原理
根據小圓半徑加角度算出第一個坐標 然后大圓根據半徑加一個角度算出第二個點坐標,然后旋轉改變角度尋找所有頂點。
代碼如下:
1 void DrawStar(float cx, float cy, float R,float r,float o)//五角星中心坐標x,y,大圓半徑,小圓半徑,初始角度 2 { 3 4 float x0, y0, x1, y1;// 5 float o0 = o;//大圓對應角度 6 float o1 = o + 0.2 * 3.14;//小圓對應角度 7 for (int i = 0;i <10;i++) 8 { 9 x0 = cx+R * cos(o0);//大圓對應的x坐標 10 y0 = cy+R * sin(o0);//大圓對應y坐標 11 x1 = cx+r * cos(o1);//小圓對應x坐標 12 y1 = cy+r * sin(o1);//小圓對應y坐標 13 if (i % 2 == 0) 14 { 15 glColor3f(1, 0, 0); 16 } 17 else 18 { 19 glColor3f(0.92, 0.89, 0.41); 20 } 21 22 glBegin(GL_POLYGON);//繪制 23 glVertex2f(x0, y0); 24 glVertex2f(x1, y1); 25 glVertex2f(cx, cy); 26 glEnd(); 27 if (i % 2 == 0) 28 { 29 o0 = o0 + 0.4 * 3.14;//大圓對應角度變換 30 } 31 else 32 { 33 o1 = o1 + 0.4 * 3.14;//小圓對應角度變換 34 } 35 36 } 37 38 39 40 }
七、繪制結果
八、附件
所有代碼

1 // OpenGLOld.cpp : 定義控制台應用程序的入口點。 2 // 3 #include <GL/glew.h>//OpenGL庫 4 #include <GL/glut.h>//OpenGL輔助庫 5 #include <math.h> 6 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //這句是不讓控制台窗體出現,如果想要出現,去掉即可。 7 8 void init(void) 9 { 10 glClearColor(1.0, 1.0, 1.0, 1.0);//設置背景色白色 11 } 12 void DrawStar(float cx, float cy, float R,float r,float o)//五角星中心坐標x,y,大圓半徑,小圓半徑,初始角度 13 { 14 15 float x0, y0, x1, y1;// 16 float o0 = o;//大圓對應角度 17 float o1 = o + 0.2 * 3.14;//小圓對應角度 18 for (int i = 0;i <10;i++) 19 { 20 x0 = cx+R * cos(o0);//大圓對應的x坐標 21 y0 = cy+R * sin(o0);//大圓對應y坐標 22 x1 = cx+r * cos(o1);//小圓對應x坐標 23 y1 = cy+r * sin(o1);//小圓對應y坐標 24 if (i % 2 == 0) 25 { 26 glColor3f(1, 0, 0); 27 } 28 else 29 { 30 glColor3f(0.92, 0.89, 0.41); 31 } 32 33 glBegin(GL_POLYGON);//繪制 34 glVertex2f(x0, y0); 35 glVertex2f(x1, y1); 36 glVertex2f(cx, cy); 37 glEnd(); 38 if (i % 2 == 0) 39 { 40 o0 = o0 + 0.4 * 3.14;//大圓對應角度變換 41 } 42 else 43 { 44 o1 = o1 + 0.4 * 3.14;//小圓對應角度變換 45 } 46 47 } 48 49 50 51 } 52 void display(void) 53 { 54 glClear(GL_COLOR_BUFFER_BIT);//清除幀緩存 55 56 DrawStar(300, 300, 120, 50, 0.1*3.14); 57 58 //glFlush();//單緩沖時必須要,說明繪圖命令(函數)結束 59 glutSwapBuffers();//交換緩沖(雙緩沖時使用) 60 } 61 62 void reshape(int width, int height) 63 { 64 glViewport(0, 0, width, height);//設置視區(窗口內繪圖區域) 65 66 glMatrixMode(GL_PROJECTION); 67 glLoadIdentity(); 68 gluOrtho2D(0, width, 0, height);//設置圖形數據范圍 69 glMatrixMode(GL_MODELVIEW); 70 glLoadIdentity(); 71 } 72 73 void keyboard(unsigned char key, int x, int y) 74 { 75 } 76 77 int main(int argc, char* argv[]) 78 { 79 glutInitWindowPosition(200, 200);//應用程序窗口位置 80 glutInitWindowSize(800, 600);//窗口大小 81 82 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//雙緩沖,單緩沖為GLUT_SINGLE 83 glutCreateWindow("五角星繪制");//創建窗口,參數為窗口標題 84 init(); 85 86 glutDisplayFunc(display);//圖形繪制 87 glutReshapeFunc(reshape);//窗口大小變化 88 glutKeyboardFunc(keyboard);//鍵盤交互 89 90 glutMainLoop();//必須,進入GLUT事件處理循環 91 92 return 0; 93 }