基本图元的生成算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基本图元的生成算法一、实验目的1、初步了解显示窗口与视区的关系2、掌握OpengGL点、直线、多边形的绘制3、掌握DDA直线生成算法。4、掌握Bresenham直线生成算法二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。软件环境:操作系统:WindowsXP。语言开发工具:VC6.0。三、实验内容与要求1、调出实验一的源代码运行,调整修改使得显示窗口大小改变时,绘制的矩形大小随之改变。如图2-1所示。提示:(1)在main函数里添加注册窗口变化函数glutReshapeFunc(myreshape);(放在glutMainLoop()之前)(2)在程序中添加窗口改变子函数,参数w,h为当前显示窗口的宽和高voidmyreshape(GLsizeiw,GLsizeih){glViewport(0,0,w,h);//设置视区位置glMatrixMode(GL_PROJECTION);//设置投影变换模式glLoadIdentity();//调单位矩阵,清空当前矩阵堆栈if(w=h)gluOrtho2D(0,300,0,300*(GLfloat)h/(GLfloat)w);//设置裁剪窗口大小elsegluOrtho2D(0,300*(GLfloat)w/(GLfloat)h,0,300);}a)显示窗口改变前b)显示窗口变大后未修改前的初始源程序参考如下:/*myfirstprogram.cpp*/#includeglut.hvoiddisplay(void){glClear(GL_COLOR_BUFFER_BIT);//刷新颜色缓冲区glRectf(0,0,0.5,0.5);glFlush();//用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行}voidmain(intargc,char**argv){glutInit(&argc,argv);//初始化GLUT库glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//设置显示模式glutInitWindowSize(100,200);glutCreateWindow(hello);//创建窗口,标题为“hello”glutDisplayFunc(display);//用于绘制当前窗口glutMainLoop();//表示开始运行程序,用于程序的结尾}2、自己参照讲义或教材按照自己的构思画二维平面图形,修改样本程序circle-algorithm.cpp将上面的矩形替换成自己构思的二维平面图形。注意顶点的顺序。参考函数:(1)、点绘制举例glPointSize(2.0)//点的大小设置glBegin(GL_POINTS);glColor3f(1.0,1.0,1.0);glVertex2f(-0.5,-0.5);//顶点glColor3f(1.0,0.0,1.0);glVertex2f(-0.5,0.5);glColor3f(0.0,1.0,1.0);glVertex2f(0.5,0.5);glColor3f(1.0,1.0,0.0);glVertex2f(0.5,-0.5);glEnd()(2)、直线/三角形/四边形绘制举例glLineWidth(2.0);glBegin(GL_LINES);//glBegin(GL_LINE_STRIP);//glBegin(GL_LINE_LOOP);//glBegin(GL_TRIANGLES);//glBegin(GL_TRIANGLE_STRIP);//glBegin(GL_TRIANGLE_FAN);//glBegin(GL_QUADS);//glBegin(GL_TRIANGLE_STRIP);glVertex2f(-0.5,0.5);glVertex2f(-0.5,-0.5);glColor3f(1.0,1.0,1.0);glVertex2f(-0.5,0.5);glColor3f(1.0,1.0,0.0);glVertex2f(0.5,-0.5);glEnd();(3)、多边形举例glBegin(GL_POLYGON);glVertex2f(-0.5,0.5);glVertex2f(-0.5,-0.5);glColor3f(1.0,1.0,1.0);glVertex2f(0,-0.5);glColor3f(1.0,1.0,0.0);glVertex2f(0.5,-0.5);glVertex2f(0.5,0.5);glEnd();3、读懂DDA直线生成算法伪代码,并修改伪代码,使之变成可行的OpenGL代码,验证DDA直线生成算法。DDA直线生成伪代码//x0,y0表示直线的起始点,x1,y1表示直线的终止点,color表示直线的绘制颜色voidDDA_line(intx0,inty0,intx1,inty1,intcolor){intdx=x1–x0,dy=y1–y0,k;floatxIncrement,yIncrement,steps,x=x0,y=y0;if(abs(dx)abs(dy))steps=abs(dx);elsesteps=abs(dy);xIncrement=(float)(dx)/steps;yIncrement=(float)(dy)/steps;for(k=0;ksteps;k++){Setpixel(round(x),round(y),color);x+=xIncrement;y+=yIncrement;}}提示:使用学过的画点函数替换setpixel(round(x),round(y),color)函数。图2-24、读懂Bresenham直线生成算法伪代码,并修改伪代码,使之变成可行的OpenGL代码,验证Bresenham直线生成算法。要求在函数voidBresenham_Circle_Algorithm(intcx,intcy,intradius)中写出自己的Bresenham画圆法代码。思考选做:5、DDA算法来绘制N多边形。用n多边形逼近圆,最小多边形为3角形。将自己的代码写在函数NSidedPolygon(intn,intcx,intcy,intradius)里,使用DDA算法来绘制N多边形(不要使用OpenGL绘制多边形的函数)。我们知道OpenGL画点功能为:glBegin(GL_Points);glVertex2f(x,y);glEnd();由于n多边形有n条边,所以必须画n条直线。将画直线的代码写在函数DrawLine(intx1,inty1,intx2,inty2)中,考虑n多边形的n条直线是各个方向,即有斜率|k|=1的情况,又有斜率|k|1的情况,你可以使用学过的画直线方法,如DDA算法。阅读样本程序,参见circle-algorithm.cpp:附:样本程序circle-algoritm.cpp#includeglut.h#includestdio.h#includestdlib.h#includemath.h//setsomeinitialparameters,suchasthecenterofthecircle(cx,cy),theradiusofthecircle,intcx=150,cy=150,radius=80;voidDDA_Line(intx1,inty1,intx2,inty2);voidBresenham_DrawLine(intx1,inty1,intx2,inty2);voidNSidedPolygon(intn,intcx,intcy,intradius);voidDisplay(void);voidReshape(intw,inth);intmain(intargc,char**argv){glutInit(&argc,argv);glutInitWindowPosition(0,0);glutInitWindowSize(window_width,window_height);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutCreateWindow(CircleGenerationAlgorithm);glutDisplayFunc(Display);glutReshapeFunc(Reshape);glutMainLoop();return0;}voidDisplay(void){/*YOURCODEHERE*/glutSwapBuffers();}voidReshape(intw,inth){glMatrixMode(GL_PROJECTION);glLoadIdentity();glViewport(0,0,w,h);gluOrtho2D(0,w,0,h);//glutPostRedisplay();}voidDDA_Line(intx1,inty1,intx2,inty2);{/*YOURCODEHERE*/}voidBresenham_DrawLine(intx1,inty1,intx2,inty2);{/*YOURCODEHERE*/}voidNSidedPolygon(intn,intcx,intcy,intradius){/*YOURCODEHERE*/}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功