计算机图形学实验——利用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 }
所有代码

猜你喜欢

转载自www.cnblogs.com/shdwin/p/12512861.html