計算機圖形學實驗——利用OpenGL函數繪制五角星


一、實驗名稱:五角星的繪制
二、實驗目的:了解 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 }
所有代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM