资源描述
opengl图形填充、正余弦曲线绘制、字符输出(C++)
精品文档
实验五
1、 实验目的和要求
了解且掌握图形填充、曲线绘制和字符输出等技术。
2、 实验内容
1) 用OpenGL实现用黑白相间的棋盘图案填充多边形
2) 用OpenGL分别用点和折线模式实现正弦和余弦的绘制
3) 用OpenGL在屏幕上输出”OpenGL”字样
3、 实验步骤
1) 相关算法及原理描述
① 图案填充多边形
多边形模式设置函数为:
void glPolygonMode(GLenum face,GLenum mode);
控制多边形指定面的绘制模式。参数face为GL_FRONT、GL_BACK或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_STIPPLE) 关闭。
② 正弦和余弦曲线的绘制
线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。
③ 在屏幕上显示字符
在OpenGL实用程序工具包中包含了一些预定义的字符库,用来显示点阵和矢量字符。
函数 void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。其中font是GLUT符号常数,指定点阵字库。参数character采用ASCII编码的形式指定要显示的字符。
用函数glutBitmapCharacter 显示字符时,是将当前的光栅位置作为字符的左下角点,函数执行后,点阵字符装入刷新缓冲存储器,当前的光栅位置会在x坐标方向上获得一个字符宽度的增量,这样可以较轻易的生成一个水平方向的字符串。
2) 程序调试、测试与运行结果分析
① 图案填充多边形
② 正余弦曲线的绘制
③ 在屏幕上显示字符
4、 实验总结
这次的实验有三个,其中显示字符比较简单,只需要调用一个函数就可以完成,各字母对应的ASCII码查找也简单,所以完成的很快很顺利。
再就是正余弦曲线的绘制,之前都有做过直线的绘制,基本都是大同小异,稍有难处的就是曲线坐标的确定。在函数中我用一段循环语句来确定曲线点的坐标。
最难做的就是棋盘填充多边形了。这个实验的代码也很简单,遇到困难的是数组定义位图。其实数组的编写现在也没有搞太明白,感觉设计起来很难,有在网上查资料,才最终解决了。对知识了解,但编写还是有些困难。
这次的实验也是一样的有趣,吸引人,以后会更加努力的。
5、 附录
收集于网络,如有侵权请联系管理员删除
1) 棋盘填充多边形
#include<gl/glut.h>
void 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, 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
};
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,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);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(500,300);
glutInitWindowPosition(100,100);
glutCreateWindow("棋盘图形填充");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return 0;
}
2) 正余弦曲线的绘制
#include<math.h>
#include <gl/glut.h>
void MyDisplay();
void Init();
void DrawSin();
void MyDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
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_LINE_STRIP);
for(float x=-1/factor;x<1/factor;x+=0.001)
{
glVertex2f(x*factor,sin(x)*factor);
}
glEnd();
glBegin(GL_LINE_STRIP);
for(float y=-1/factor;y<1/factor;y+=0.001)
{
glVertex2f(y*factor,cos(y)*factor);
}
glEnd();
glutSwapBuffers();
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,150);
glutCreateWindow("正余弦曲线绘制");
Init();
glutDisplayFunc(MyDisplay);
glutMainLoop();
return 0;
}
3) 在屏幕显示字符
#include<gl/glut.h>
int winWidth=600,winHeight=300;
void Initial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
void ChangeSize(int w,int 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);
glutStrokeCharacter(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;
}
展开阅读全文