opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx

上传人:b****8 文档编号:10361875 上传时间:2023-02-10 格式:DOCX 页数:11 大小:55.42KB
下载 相关 举报
opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx_第1页
第1页 / 共11页
opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx_第2页
第2页 / 共11页
opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx_第3页
第3页 / 共11页
opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx_第4页
第4页 / 共11页
opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx

《opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx》由会员分享,可在线阅读,更多相关《opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx(11页珍藏版)》请在冰豆网上搜索。

opengl图形填充正余弦曲线绘制字符输出C++电子教案.docx

opengl图形填充正余弦曲线绘制字符输出C++电子教案

 

opengl图形填充、正余弦曲线绘制、字符输出(C++)

实验五

1、实验目的和要求

了解且掌握图形填充、曲线绘制和字符输出等技术。

2、实验内容

1)用OpenGL实现用黑白相间的棋盘图案填充多边形

2)用OpenGL分别用点和折线模式实现正弦和余弦的绘制

3)用OpenGL在屏幕上输出”OpenGL”字样

3、实验步骤

1)相关算法及原理描述

1图案填充多边形

多边形模式设置函数为:

voidglPolygonMode(GLenumface,GLenummode);

控制多边形指定面的绘制模式。

参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。

缺省时,绘制的是正反面全填充式多边形。

设置图案填充式多边形函数为:

voidglPolygonStipple(constGLubyte*mask);

为当前多边形定义填充图案模式。

参数mask是一个指向32x32位图的指针。

与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。

注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE)关闭。

2正弦和余弦曲线的绘制

线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。

绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。

3在屏幕上显示字符

在OpenGL实用程序工具包中包含了一些预定义的字符库,用来显示点阵和矢量字符。

函数voidglutBitmapCharacter(void*font,intcharacter);显示一个GLUT位图字符。

其中font是GLUT符号常数,指定点阵字库。

参数character采用ASCII编码的形式指定要显示的字符。

用函数glutBitmapCharacter显示字符时,是将当前的光栅位置作为字符的左下角点,函数执行后,点阵字符装入刷新缓冲存储器,当前的光栅位置会在x坐标方向上获得一个字符宽度的增量,这样可以较轻易的生成一个水平方向的字符串。

2)程序调试、测试与运行结果分析

1图案填充多边形

 

2正余弦曲线的绘制

 

3在屏幕上显示字符

 

4、实验总结

这次的实验有三个,其中显示字符比较简单,只需要调用一个函数就可以完成,各字母对应的ASCII码查找也简单,所以完成的很快很顺利。

再就是正余弦曲线的绘制,之前都有做过直线的绘制,基本都是大同小异,稍有难处的就是曲线坐标的确定。

在函数中我用一段循环语句来确定曲线点的坐标。

最难做的就是棋盘填充多边形了。

这个实验的代码也很简单,遇到困难的是数组定义位图。

其实数组的编写现在也没有搞太明白,感觉设计起来很难,有在网上查资料,才最终解决了。

对知识了解,但编写还是有些困难。

这次的实验也是一样的有趣,吸引人,以后会更加努力的。

 

5、附录

1)棋盘填充多边形

#include

voidInitial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0,200.0,0.0,150.0);

}

GLubytetianchong[]={

/*填充模式定义(32x32)*/

0x00,0x01,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,0xff,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,0xfc,0x00,

0x00,0x1f,0xf8,0x00,

0x00,0x0f,0xf0,0x00,

0x00,0x07,0xe0,0x00,

0x00,0x03,0xc0,0x00,

0x00,0x01,0x80,0x00

};

voidDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

///*绘制一个指定图案填充的矩形*/

glColor3f(0.1,0.8,0.7);

glEnable(GL_POLYGON_STIPPLE);

glPolygonStipple(tianchong);

glRectf(50.0f,100.0f,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();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(500,300);

glutInitWindowPosition(100,100);

glutCreateWindow("棋盘图形填充");

glutDisplayFunc(Display);

Initial();

glutMainLoop();

return0;

}

2)正余弦曲线的绘制

#include

#include

voidMyDisplay();

voidInit();

voidDrawSin();

voidMyDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

DrawSin();

glFlush();

}

voidInit()

{

glColor3f(1.0f,0.0f,0.0f);

glClearColor(1.0f,1.0f,1.0f,1.0f);

}

voidDrawSin()

{

constfloatfactor=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_LINE_STRIP);

for(floatx=-1/factor;x<1/factor;x+=0.001)

{

glVertex2f(x*factor,sin(x)*factor);

}

glEnd();

glBegin(GL_LINE_STRIP);

for(floaty=-1/factor;y<1/factor;y+=0.001)

{

glVertex2f(y*factor,cos(y)*factor);

}

glEnd();

glutSwapBuffers();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(400,300);

glutInitWindowPosition(100,150);

glutCreateWindow("正余弦曲线绘制");

Init();

glutDisplayFunc(MyDisplay);

glutMainLoop();

return0;

}

 

3)在屏幕显示字符

#include

intwinWidth=600,winHeight=300;

voidInitial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);

}

voidChangeSize(intw,inth)

{

winWidth=w;winHeight=h;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,winWidth,0.0,winHeight);

}

voidDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f,0.0f,0.0f);

glutStrokeCharacter(GLUT_STROKE_ROMAN,79);

glutStrokeCharacter(GLUT_STROKE_ROMAN,112);

glutStrokeCharacter(GLUT_STROKE_ROMAN,101);

glutStrokeCharacter(GLUT_STROKE_ROMAN,110);

glutStrokeCharacter(GLUT_STROKE_ROMAN,71);

glutStrokeCharacter(GLUT_STROKE_ROMAN,76);

glutSwapBuffers();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(500,300);

glutInitWindowPosition(100,100);

glutCreateWindow("WriteWords");

glutDisplayFunc(Display);

glutReshapeFunc(ChangeSize);

Initial();

glutMainLoop();

return0;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1