您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > OpenGL画直线、圆、椭圆
使用openGl画直线(DDA算法)、画圆、椭圆(Bresenham算法)#includestdlib.h#includeiostream.h#includeGL/glut.h/*initialization:*/voidmyinit(void){/*attributes*/glClearColor(1.0,1.0,1.0,0.0);//设置背景颜色glColor3f(1.0,0.0,0.0);//设置绘制颜色为红色/*setupviewing:*//*500x500windowwithoriginlowerleft*/glMatrixMode(GL_PROJECTION);//指定设置投影参数glLoadIdentity();/*OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。*/gluOrtho2D(0.0,500.0,0.0,500.0);//设置投影参数glMatrixMode(GL_MODELVIEW);/*这两个都是glMatrixMode()函数的参数,那就先说说glMatrixMode吧~,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有,GL_PROJECTION,GL_MODELVIEW和GL_TEXTURE;如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();如果参数是GL_MODELVIEW,这个是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数,接下来用到的就是像gluLookAt()这样的函数;若是GL_TEXTURE,就是对纹理相关进行操作;顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。*/}voidplot_circle_points(intxc,intyc,intx,inty)//画圆{glBegin(GL_POINTS);glVertex3f(xc+x,yc+y,0);glVertex3f(xc-x,yc+y,0);glVertex3f(xc+x,yc-y,0);glVertex3f(xc-x,yc-y,0);glVertex3f(xc+y,yc+x,0);glVertex3f(xc-y,yc+x,0);glVertex3f(xc+y,yc-x,0);glVertex3f(xc-y,yc-x,0);glEnd();}voiddrawcircle(intxc,intyc,intradius){intx,y,p;x=0;y=radius;p=3-2*radius;glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POINTS);while(xy){plot_circle_points(xc,yc,x,y);if(p0)p=p+4*x+6;else{p=p+4*(x-y)+10;y-=1;}x+=1;}if(x==y)plot_circle_points(xc,yc,x,y);}voidputpixel(intxc,intyc,intx,inty)//画椭圆{glBegin(GL_POINTS);glVertex3f(xc+x,yc+y,0);glEnd();}voiddrawEllipse(intxc,intyc,inta,intb){intx,y;floatd1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);putpixel(xc,yc,x,y);putpixel(xc,yc,-x,-y);putpixel(xc,yc,-x,y);putpixel(xc,yc,x,-y);while(b*b*(x+1)a*a*(y-0.5)){if(d10){d1+=b*b*(2*x+3);x++;}else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}putpixel(xc,yc,x,y);putpixel(xc,yc,-x,-y);putpixel(xc,yc,-x,y);putpixel(xc,yc,x,-y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y0){if(d2=0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}else{d2+=a*a*(-2*y+3);y--;}putpixel(xc,yc,x,y);putpixel(xc,yc,-x,-y);putpixel(xc,yc,-x,y);putpixel(xc,yc,x,-y);}}voiddda_line(intxa,intya,intxb,intyb)//画直线{GLfloatdelta_x,delta_y,x,y;intdx,dy,steps;dx=xb-xa;dy=yb-ya;if(abs(dx)abs(dy))steps=abs(dx);elsesteps=abs(dy);delta_x=(GLfloat)dx/(GLfloat)steps;delta_y=(GLfloat)dy/(GLfloat)steps;x=xa;y=ya;glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POINTS);glVertex3f(x,y,0);for(intk=1;k=steps;k++){x+=delta_x;y+=delta_y;glBegin(GL_POINTS);glVertex3f(x,y,0);glEnd();}}/*thedisplaycallback:*/voiddisplay1()//画直线{glClear(GL_COLOR_BUFFER_BIT);/*clearthewindow*/glViewport(0,0,500,500);dda_line(20,20,420,350);glFlush();}voiddisplay2()//画圆{glClear(GL_COLOR_BUFFER_BIT);/*clearthewindow*/glViewport(0,0,500,500);drawcircle(250,250,100);glFlush();}voiddisplay3()//画椭圆{glClear(GL_COLOR_BUFFER_BIT);/*clearthewindow*/glViewport(0,0,500,500);drawEllipse(250,250,60,40);glFlush();}intmain(intargc,char**argv){/*StandardGLUTinitialization*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(500,500);//设置窗口的尺寸glutInitWindowPosition(0,0);//是指窗口的位置cout************************************************endl;cout****请选择如下操作:*****endl;cout****1.用DDA画线*****endl;cout****2.用Bresenham算法画圆*****endl;cout****3.用Bresenham算法画椭圆*****endl;cout************************************************endl;cout请选择如下操作:;intchoice;cinchoice;switch(choice){case1:glutCreateWindow(Bresenham算法画直线);//给窗口命名glutDisplayFunc(display1);//设置当前窗口的显示回调函数myinit();//完成窗口初始化glutMainLoop();//启动主GLUT事件处理循环break;case2:glutCreateWindow(Bresenham算法画圆);glutDisplayFunc(display2);myinit();glutMainLoop();break;case3:glutCreateWindow(MidBresenham算法画椭圆);glutDisplayFunc(display3);myinit();glutMainLoop();default:return0;}return0;}
本文标题:OpenGL画直线、圆、椭圆
链接地址:https://www.777doc.com/doc-5719234 .html