一、实验名称:五角星的绘制
二、实验目的:了解 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 }
七、绘制结果



八、附件
所有代码
060_N.png)
H@AF9HTLOW_I8$VQA4G.png)


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 }

来源:https://www.cnblogs.com/shdwin/p/12512861.html
