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