1、opengl图形填充正余弦曲线绘制字符输出C+电子教案opengl图形填充、正余弦曲线绘制、字符输出(C+)实验五1、 实验目的和要求了解且掌握图形填充、曲线绘制和字符输出等技术。2、 实验内容1) 用OpenGL实现用黑白相间的棋盘图案填充多边形2) 用OpenGL分别用点和折线模式实现正弦和余弦的绘制3) 用OpenGL在屏幕上输出”OpenGL”字样3、 实验步骤1) 相关算法及原理描述1 图案填充多边形多边形模式设置函数为:void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘制模式。参数face为GL_FRONT、GL_BACK或
2、GL_FRONT_AND_BACK;参数mode为 GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。缺省时,绘制的是正反面全填充式多边形。设置图案填充式多边形函数为:void glPolygonStipple(const GLubyte *mask);为当前多边形定义填充图案模式。参数mask是一个指向32x32位图的指针。与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_S
3、TIPPLE) 关闭。2 正弦和余弦曲线的绘制线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。3 在屏幕上显示字符在OpenGL实用程序工具包中包含了一些预定义的字符库,用来显示点阵和矢量字符。函数 void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。其中font是GLUT符号常数,指定点阵字库。参数character采用ASCII编码的形式指定要显示的字符。用函数glutBi
4、tmapCharacter 显示字符时,是将当前的光栅位置作为字符的左下角点,函数执行后,点阵字符装入刷新缓冲存储器,当前的光栅位置会在x坐标方向上获得一个字符宽度的增量,这样可以较轻易的生成一个水平方向的字符串。2) 程序调试、测试与运行结果分析1 图案填充多边形2 正余弦曲线的绘制3 在屏幕上显示字符4、 实验总结这次的实验有三个,其中显示字符比较简单,只需要调用一个函数就可以完成,各字母对应的ASCII码查找也简单,所以完成的很快很顺利。再就是正余弦曲线的绘制,之前都有做过直线的绘制,基本都是大同小异,稍有难处的就是曲线坐标的确定。在函数中我用一段循环语句来确定曲线点的坐标。最难做的就是
5、棋盘填充多边形了。这个实验的代码也很简单,遇到困难的是数组定义位图。其实数组的编写现在也没有搞太明白,感觉设计起来很难,有在网上查资料,才最终解决了。对知识了解,但编写还是有些困难。这次的实验也是一样的有趣,吸引人,以后会更加努力的。5、 附录1) 棋盘填充多边形#includevoid Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0);GLubyte tianchong=/* 填充模式定义 (32x32) */0x00, 0x
6、01, 0x80, 0x00,0x00, 0x03, 0xc0, 0x00,0x00, 0x07, 0xe0, 0x00,0x00, 0x0f, 0xf0, 0x00,0x00, 0x1f, 0xf8, 0x00,0x00, 0x3f, 0xfc, 0x00,0x00, 0x7f, 0xfe, 0x00,0x00, 0xff, 0xff, 0x00,0x01, 0xff, 0xff, 0x80,0x03, 0xff, 0xff, 0xc0,0x07, 0xff, 0xff, 0xe0,0x0f, 0xff, 0xff, 0xf0,0x1f, 0xff, 0xff, 0xf8,0x3f, 0xf
7、f, 0xff, 0xfc,0x7f, 0xff, 0xff, 0xfe,0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff,0x7f, 0xff, 0xff, 0xfe,0x3f, 0xff, 0xff, 0xfc,0x1f, 0xff, 0xff, 0xf8,0x0f, 0xff, 0xff, 0xf0,0x07, 0xff, 0xff, 0xe0,0x03, 0xff, 0xff, 0xc0,0x01, 0xff, 0xff, 0x80,0x00, 0xff, 0xff, 0x00,0x00, 0x7f, 0xfe, 0x00,0x00, 0x3f
8、, 0xfc, 0x00,0x00, 0x1f, 0xf8, 0x00,0x00, 0x0f, 0xf0, 0x00,0x00, 0x07, 0xe0, 0x00,0x00, 0x03, 0xc0, 0x00,0x00, 0x01, 0x80, 0x00;void Display(void) glClear(GL_COLOR_BUFFER_BIT); /* 绘制一个指定图案填充的矩形 */ glColor3f(0.1,0.8,0.7); glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(tianchong); glRectf(50.0f,100.0f
9、,150.0f,50.0f);/* 绘制一个指定图案填充的三角形*/ glColor3f(0.9,0.86,0.4); glPolygonStipple(tianchong); glBegin(GL_TRIANGLES); glVertex2i(10,10); glVertex2i(90,10); glVertex2i(10,90); glEnd(); glDisable (GL_POLYGON_STIPPLE); glFlush(); glutSwapBuffers();int main(int argc,char*argv) glutInit(&argc,argv); glutInitDi
10、splayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(500,300); glutInitWindowPosition(100,100); glutCreateWindow(棋盘图形填充); glutDisplayFunc(Display); Initial(); glutMainLoop(); return 0;2) 正余弦曲线的绘制#include#include void MyDisplay();void Init();void DrawSin();void MyDisplay() glClear(GL_COLOR_BUFFER_BIT)
11、; DrawSin(); glFlush();void Init() glColor3f(1.0f,0.0f,0.0f); glClearColor(1.0f,1.0f,1.0f,1.0f);void DrawSin() const float factor=0.1; glBegin(GL_LINES); glVertex2f(-1,0); glVertex2f(1,0); glVertex2f(0,-1); glVertex2f(0,1); glEnd(); /glLineStipple (5,0x1C47); /glBegin (GL_LINES); /用虚线绘制 glBegin(GL_L
12、INE_STRIP); for(float x=-1/factor;x1/factor;x+=0.001) glVertex2f(x*factor,sin(x)*factor); glEnd(); glBegin(GL_LINE_STRIP); for(float y=-1/factor;y1/factor;y+=0.001) glVertex2f(y*factor,cos(y)*factor); glEnd(); glutSwapBuffers();int main(int argc,char*argv) glutInit(&argc,argv); glutInitDisplayMode(G
13、LUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,150); glutCreateWindow(正余弦曲线绘制); Init(); glutDisplayFunc(MyDisplay); glutMainLoop(); return 0;3) 在屏幕显示字符#includeint winWidth=600,winHeight=300;void Initial(void) glClearColor(1.0f,1.0f,1.0f,1.0f);void ChangeSize(int w,int
14、h) winWidth=w; winHeight=h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight);void Display(void) glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,0.0f,0.0f); glutStrokeCharacter(GLUT_STROKE_ROMAN,79); glutStrokeCharacter(GLUT_STROKE_ROMAN,112); gl
15、utStrokeCharacter(GLUT_STROKE_ROMAN,101); glutStrokeCharacter(GLUT_STROKE_ROMAN,110); glutStrokeCharacter(GLUT_STROKE_ROMAN,71); glutStrokeCharacter(GLUT_STROKE_ROMAN,76); glutSwapBuffers();int main(int argc,char*argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(500,300); glutInitWindowPosition(100,100); glutCreateWindow(Write Words); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize); Initial(); glutMainLoop(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1