计算机图形学画椭圆和圆.docx
《计算机图形学画椭圆和圆.docx》由会员分享,可在线阅读,更多相关《计算机图形学画椭圆和圆.docx(55页珍藏版)》请在冰豆网上搜索。
计算机图形学画椭圆和圆
计算机图形学-画椭圆和圆
姓名
XXX
学号
xxx
实验组
实验时间
10-24
指导教师
成绩
实验项目名称
圆,椭圆中点算法
实验要求
优化后的算法:
二次差分法
可任意指定圆心坐标
实验目的
实验环境
VS2015
实验内容
圆:
voidBresenham_Circle(intxc,intyc,intr)
{
intx,y,d;
x=0;
y=r;
d=3-2*r;
glVertex2i(x+xc,y+yc);
while(x{if(d<0){d=d+4*x+6;}else{d=d+4*(x-y)+10;y--;}x++;glVertex2i(x+xc,y+yc);glVertex2i(y+xc,x+yc);glVertex2i(y+xc,-x+yc);glVertex2i(x+xc,-y+yc);glVertex2i(-x+xc,-y+yc);glVertex2i(-y+xc,-x+yc);glVertex2i(-x+xc,y+yc);glVertex2i(-y+xc,x+yc);}} 椭圆:voidEllipsepot(intx0,inty0,intx,inty){//1setPixel((x0+x),(y0+y));//2setPixel((x0+x),(y0-y));//3setPixel((x0-x),(y0-y));//4setPixel((x0-x),(y0+y));}//中点画椭圆算法voidMidPoint_Ellipse(intx0,inty0,inta,intb){doublesqa=a*a;doublesqb=b*b;doubled=sqb+sqa*(0.25-b);intx=0;inty=b;Ellipsepot(x0,y0,x,y);//1while(sqb*(x+1){if(d<0){d+=sqb*(2*x+3);}else{d+=(sqb*(2*x+3)+sqa*((-2)*y+2));--y;}++x;Ellipsepot(x0,y0,x,y);}d=(b*(x+0.5))*2+(a*(y-1))*2-(a*b)*2;//2while(y>0){if(d<0){d+=sqb*(2*x+2)+sqa*((-2)*y+3);++x;}else{d+=sqa*((-2)*y+3);}--y;Ellipsepot(x0,y0,x,y);}}实验结果 实验总结感觉自己对于图形用函数表达出来还是有点不行,多亏了室友的讲解,才画了出来 签名:20XX年10月24日计算机图形学实验报告姓名:_____________学号:_____________班级:_____________时间:_____20xx年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。学会配置OpenGL环境,并在该环境中编程绘图。2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG编程辅助库:aux、OpenGL实用程序工具包(OpenGLutilitytoolkit,GLUT):glut、Windows专用库:wgl。OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。3.实验代码及结果3.1点的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glPointSize(10);//三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:3.2直线的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glBegin(GL_LINE_LOOP);//五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:3.3多边形面的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glBegin(GL_TRIANGLES);//等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。2.实验内容(一)数值微分法数值微分法直接从直线的微分方程生成直线。给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),得到直线的微分方程dy/dx=△y/△x=(Y1-Y0)/(X1-X0)=k。数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和△y是成比例的,因此通过在当前位置(Xi,Yi)分别加上两个小增量ε△x和ε△y(ε为无穷小的正数)来求下一点(X(i+1),Y(i+1))的x,y坐标。(二)中点画线算法给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。绘图过程如下:.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。.计算初始值△x,△y,d=△x-2△y,x=X0,y=Y0..绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。.当直线没有画完时,重复步骤否则结束。(三)Bresenham算法算法步骤如下:.输入直线两端点P0(X0,Y0)和P1(X1,Y1)。.计算初始值△x,△y,e=-△x,x=X0,y=Y0。.绘制点(x,y)。.e更新为e+2△y。判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e-2△x;否则(x,y)更新为(x+1,y)。.当直线没有画完时,重复步骤和;否则结束。3.实验代码及结果3.1数值微分算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色glBegin(GL_LINES);intx0=10;inty0=20;intx1=30;inty1=40;intcolor=10;intdx,dy,epsl,k;floatx,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;//if(abs(dx)>abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glVertex2i(int(x+0.5),(int)(y+0.5));x+=xIncre;y+=yIncre;}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}实验结果:2.2中点画线算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色glBegin(GL_POINTS);intx0=50;inty0=20;intx1=100;inty1=120;intcolor=10;intdx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=2*dy;while(x<=x1){glVertex2i(x,y);x++;if(d<0){y++;d+=UpIncre;}elsed+=DownIncre;}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}实验结果:2.3Bresenham算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//Bresenham算法glBegin(GL_POINTS);intx0=10;inty0=20;intx1=90;inty1=90;intcolor=10;intx,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){glVertex2i(x,y);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的现实模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,200);//设置窗口的位置glutCreateWindow("点");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示函数Initial();//完成窗口的初始化glutMainLoop();//启动主GLUT事件处理循环return0;}实验结果:实验三圆绘制实验1.实验目的2.实验内容(一)八分法画圆圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。(二)中点Bresenham画圆算法算法步骤如下:输入圆的半径R计算初始值d=1-R,x=0,y=R。绘制点(x,y)及其在八分圆中的另外7个对称点。判断d的符号。若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。当x和;否则结束。(三)椭圆的中点Bresenham算法算法步骤如下:输入椭圆的长半轴a和短半轴b。计算初始值d=b^2+a^2(-b+0.25),x=0,y=b。绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。当b^2(x+1)和;否则转到步骤。用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+
if(d<0)
d=d+4*x+6;
}
else
d=d+4*(x-y)+10;
y--;
x++;
glVertex2i(y+xc,x+yc);
glVertex2i(y+xc,-x+yc);
glVertex2i(x+xc,-y+yc);
glVertex2i(-x+xc,-y+yc);
glVertex2i(-y+xc,-x+yc);
glVertex2i(-x+xc,y+yc);
glVertex2i(-y+xc,x+yc);
椭圆:
voidEllipsepot(intx0,inty0,intx,inty)
//1
setPixel((x0+x),(y0+y));
//2
setPixel((x0+x),(y0-y));
//3
setPixel((x0-x),(y0-y));
//4
setPixel((x0-x),(y0+y));
//中点画椭圆算法
voidMidPoint_Ellipse(intx0,inty0,inta,intb)
doublesqa=a*a;
doublesqb=b*b;
doubled=sqb+sqa*(0.25-b);
intx=0;
inty=b;
Ellipsepot(x0,y0,x,y);
while(sqb*(x+1){if(d<0){d+=sqb*(2*x+3);}else{d+=(sqb*(2*x+3)+sqa*((-2)*y+2));--y;}++x;Ellipsepot(x0,y0,x,y);}d=(b*(x+0.5))*2+(a*(y-1))*2-(a*b)*2;//2while(y>0){if(d<0){d+=sqb*(2*x+2)+sqa*((-2)*y+3);++x;}else{d+=sqa*((-2)*y+3);}--y;Ellipsepot(x0,y0,x,y);}}实验结果 实验总结感觉自己对于图形用函数表达出来还是有点不行,多亏了室友的讲解,才画了出来 签名:20XX年10月24日计算机图形学实验报告姓名:_____________学号:_____________班级:_____________时间:_____20xx年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。学会配置OpenGL环境,并在该环境中编程绘图。2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG编程辅助库:aux、OpenGL实用程序工具包(OpenGLutilitytoolkit,GLUT):glut、Windows专用库:wgl。OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。3.实验代码及结果3.1点的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glPointSize(10);//三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:3.2直线的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glBegin(GL_LINE_LOOP);//五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:3.3多边形面的绘制:#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形glBegin(GL_TRIANGLES);//等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。2.实验内容(一)数值微分法数值微分法直接从直线的微分方程生成直线。给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),得到直线的微分方程dy/dx=△y/△x=(Y1-Y0)/(X1-X0)=k。数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和△y是成比例的,因此通过在当前位置(Xi,Yi)分别加上两个小增量ε△x和ε△y(ε为无穷小的正数)来求下一点(X(i+1),Y(i+1))的x,y坐标。(二)中点画线算法给定直线的两端点:P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。绘图过程如下:.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。.计算初始值△x,△y,d=△x-2△y,x=X0,y=Y0..绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。.当直线没有画完时,重复步骤否则结束。(三)Bresenham算法算法步骤如下:.输入直线两端点P0(X0,Y0)和P1(X1,Y1)。.计算初始值△x,△y,e=-△x,x=X0,y=Y0。.绘制点(x,y)。.e更新为e+2△y。判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e-2△x;否则(x,y)更新为(x+1,y)。.当直线没有画完时,重复步骤和;否则结束。3.实验代码及结果3.1数值微分算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色glBegin(GL_LINES);intx0=10;inty0=20;intx1=30;inty1=40;intcolor=10;intdx,dy,epsl,k;floatx,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;//if(abs(dx)>abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glVertex2i(int(x+0.5),(int)(y+0.5));x+=xIncre;y+=yIncre;}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}实验结果:2.2中点画线算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色glBegin(GL_POINTS);intx0=50;inty0=20;intx1=100;inty1=120;intcolor=10;intdx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=2*dy;while(x<=x1){glVertex2i(x,y);x++;if(d<0){y++;d+=UpIncre;}elsed+=DownIncre;}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口位置glutCreateWindow("矩形");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//完成窗口GLUT事件处理循环return0;}实验结果:2.3Bresenham算法编程绘制直线代码:#include#includevoidInitial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色//Bresenham算法glBegin(GL_POINTS);intx0=10;inty0=20;intx1=90;inty1=90;intcolor=10;intx,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){glVertex2i(x,y);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}glEnd();glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的现实模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,200);//设置窗口的位置glutCreateWindow("点");//创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示函数Initial();//完成窗口的初始化glutMainLoop();//启动主GLUT事件处理循环return0;}实验结果:实验三圆绘制实验1.实验目的2.实验内容(一)八分法画圆圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。(二)中点Bresenham画圆算法算法步骤如下:输入圆的半径R计算初始值d=1-R,x=0,y=R。绘制点(x,y)及其在八分圆中的另外7个对称点。判断d的符号。若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。当x和;否则结束。(三)椭圆的中点Bresenham算法算法步骤如下:输入椭圆的长半轴a和短半轴b。计算初始值d=b^2+a^2(-b+0.25),x=0,y=b。绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。当b^2(x+1)和;否则转到步骤。用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+
d+=sqb*(2*x+3);
d+=(sqb*(2*x+3)+sqa*((-2)*y+2));
--y;
++x;
d=(b*(x+0.5))*2+(a*(y-1))*2-(a*b)*2;
while(y>0)
d+=sqb*(2*x+2)+sqa*((-2)*y+3);
d+=sqa*((-2)*y+3);
实验结果
实验总结
感觉自己对于图形用函数表达出来还是有点不行,多亏了室友的讲解,才画了出来
签名:
20XX年10月24日
计算机图形学实验报告
姓名:
_____________
学号:
班级:
时间:
_____20xx年12月_________
实验一OpenGL编程与图形绘制
1.实验目的
了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。
学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容
OpenGL的主要功能:
模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:
一个完整的窗口系统的OpenGL图形处理系统的结构为:
最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。
当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。
OpenGL的基本语法中相关库有:
OpenGL核心库:
gl、OpenGL实用程序库:
glu、OpenG编程辅助库:
aux、OpenGL实用程序工具包(OpenGLutilitytoolkit,GLUT):
glut、Windows专用库:
wgl。
OpenGL的基本语法中命名规则为:
OpenGL函数都遵循一个命名约定,即采用以下格式:
<库前缀><根命令><可选的参数个数><可选的参数类型>。
了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。
3.实验代码及结果
3.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);//设置投影参数
voidDisplay(void)
glClear(GL_COLOR_BUFFER_BIT);//用当前背景颜色填充窗口
glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红
//glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形
glPointSize(10);//三个点
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f);
glVertex2i(2,148);
glVertex2i(100,75);
glVertex2i(198,2);
glEnd();
glFlush();//清空OpenGL命令缓冲区,执行OpenGL程序
intmain(intargc,char*argv[])
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(400,300);//设置窗口的尺寸
glutInitWindowPosition(100,120);//设置窗口位置
glutCreateWindow("矩形");//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示回调函数
Initial();//完成窗口初始化
glutMainLoop();//完成窗口GLUT事件处理循环
return0;
运行结果:
3.2直线的绘制:
glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色
glBegin(GL_LINE_LOOP);//五角星
glVertex2i(10,10);
glVertex2i(30,35);
glVertex2i(50,10);
glVertex2i(5,25);
glVertex2i(55,25);
3.3多边形面的绘制:
glBegin(GL_TRIANGLES);//等边三角形
glVertex2f(0.0,0.0);
glVertex2f(15,25.95);
glVertex2f(30,0);
实验二直线绘制实验
1.实验目的
为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:
数值微分法、中点画线算法和Bresenham算法。
2.实验内容
(一)数值微分法
数值微分法直接从直线的微分方程生成直线。
给定直线的两端点:
P0(X0,Y0)和P1(X1,Y1),得到直线的微分方程dy/dx=△y/△x=(Y1-Y0)/(X1-X0)=k。
数值微分算法的原理是,由于直线的一阶导数是连续的,而且△x和△y是成比例的,因此通过在当前位置(Xi,Yi)分别加上两个小增量ε△x和ε△y(ε为无穷小的正数)来求下一点(X(i+1),Y(i+1))的x,y坐标。
(二)中点画线算法
P0(X0,Y0)和P1(X1,Y1),可得到直线方程F(x,y)=y-kx-b=0且k=△y/△x=(Y1-Y0)/(X1-X0)。
绘图过程如下:
.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。
.计算初始值△x,△y,d=△x-2△y,x=X0,y=Y0.
.绘制点(x,y)。
判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。
.当直线没有画完时,重复步骤
否则结束。
(三)Bresenham算法
算法步骤如下:
.输入直线两端点P0(X0,Y0)和P1(X1,Y1)。
.计算初始值△x,△y,e=-△x,x=X0,y=Y0。
.e更新为e+2△y。
判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同样将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
和
;否则结束。
3.实验代码及结果
3.1数值微分算法编程绘制直线代码:
glBegin(GL_LINES);
intx0=10;inty0=20;intx1=30;inty1=40;intcolor=10;
intdx,dy,epsl,k;
floatx,y,xIncre,yIncre;
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;//
if(abs(dx)>abs(dy))
epsl=abs(dx);
elseepsl=abs(dy);
xIncre=(float)dx/(float)epsl;
yIncre=(float)dy/(float)epsl;
for(k=0;k<=epsl;k++)
glVertex2i(int(x+0.5),(int)(y+0.5));
x+=xIncre;
y+=yIncre;
实验结果:
2.2中点画线算法编程绘制直线代码:
intx0=50;inty0=20;intx1=100;inty1=120;intcolor=10;
intdx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1)
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
d=dx-2*dy;
UpIncre=2*dx-2*dy;DownIncre=2*dy;
while(x<=x1)
glVertex2i(x,y);
y++;
d+=UpIncre;
elsed+=DownIncre;
2.3Bresenham算法编程绘制直线代码:
voidInitial(void){
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口
//Bresenham算法
intx0=10;inty0=20;intx1=90;inty1=90;intcolor=10;
intx,y,dx,dy,e;
e=-dx;x=x0;y=y0;
while(x<=x1){
e=e+2*dy;
if(e>0){
e=e-2*dx;
intmain(intargc,char*argv[]){
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的现实模式
glutInitWindowPosition(100,200);//设置窗口的位置
glutCreateWindow("点");//创建一个名为矩形的窗口
glutDisplayFunc(Display);//设置当前窗口的显示函数
Initial();//完成窗口的初始化
glutMainLoop();//启动主GLUT事件处理循环
实验三圆绘制实验
(一)八分法画圆
圆心位于原点的圆有4条对称轴x=0,y=0,y=x,y=-x。
若已知圆上任一点(x,y),可以得到其在圆周上关于四条对称轴的另外7个点(y,x),(-x,y),(-x,-y),(-y,-x),(y,-x),(x,-y)。
(二)中点Bresenham画圆算法
输入圆的半径R
计算初始值d=1-R,x=0,y=R。
绘制点(x,y)及其在八分圆中的另外7个对称点。
判断d的符号。
若d<0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
当x和;否则结束。(三)椭圆的中点Bresenham算法算法步骤如下:输入椭圆的长半轴a和短半轴b。计算初始值d=b^2+a^2(-b+0.25),x=0,y=b。绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。当b^2(x+1)和;否则转到步骤。用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+
(三)椭圆的中点Bresenham算法
输入椭圆的长半轴a和短半轴b。
计算初始值d=b^2+a^2(-b+0.25),x=0,y=b。
绘制点(x,y)及其在四分象限上的另外三个对称点。
若d<=0,则先将d更新为d+b^2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b^2(2x+3)+a^2(-2y+2),再将(x,y)更新为(x+1,y-1)。
当b^2(x+1)和;否则转到步骤。用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2绘制点(x,y)及其在四分象限上的另外三个对称点。判断d的符号。若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+
;否则转到步骤
。
用上半部分计算的最后点(x,y)来计算下半部分中d的初值d=b^2(x+0.5)^2+a^2(y-1)^2-a^2b^2
若d<=0,则先将d更新为d+b^2(2x+2)+a^2(-2y+3),再将(x,y)更新为(x+
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1