.-计算机图形学实验报告姓名:谢云飞学号:20112497班级:计算机科学与技术11-2班实验地点:逸夫楼507实验时间:2014.03.-实验1直线的生成1实验目的和要求理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。2实验环境和工具开发环境:VisualC++6.0实验平台:Experiment_Frame_One(自制平台)。本实验提供名为Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham算法,并进行分析。平台界面:如错误!未找到引用源。所示设置:通过view-setting菜单进入,如错误!未找到引用源。所示输入:通过view-input…菜单进入.如错误!未找到引用源。所示实现算法:DDA算法:voidCExperiment_Frame_OneView::DDA(intX0,intY0,intX1,intY1)Mid_Bresenham法:voidCExperiment_Frame_OneView::Mid_Bresenham(intX0,intY0,intX1,intY1).-3实验结果3.1程序流程图1)DDA算法流程图:开始定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增量xIncre,y增量yIncre↓输入两点坐标x1,y1,x0,y0↓dx=x1-x0,dy=y1-y0;_________↓_________↓↓若|dx||dy|反之epsl=|dx|epsl=|dy|↓________...________↓↓xIncre=dx/epsl;yIncre=dy/epsl↓填充(强制整形)(x+0.5,y+0.5);↓←←←←横坐标x+xIncre;纵坐标y+yIncre;↓↑若k=epsl→→→k++↓结束2)Mid_Bresenham算法流程图开始↓定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y↓输入x0,y0,x1,y1______↓______↓↓若x0x1反之x=x1;x1=x0;x0=x;x=x0;.-Y=y1;y1=y0;y0=y;y=y0;↓______..______↓↓坐标差dx=x1-x0;dy=y1-y0;判断值d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;↓填充点(x,y),且x=x+1;______↓______←←←↓↓↑若d0反之y=y+1,且d=d+UpIncred=d+DownIncre↓______.______↓↑↑↓若x=x1→→→↑↓结束3.2程序代码voidCExperiment_Frame_OneView::DDA(intX0,intY0,intX1,intY1){//----------请实现DDA算法------------//intdx,dy,epsl,k;floatx,y,xIncre,yIncre;dx=X1-X0;dy=Y1-X0;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++){DrawPixel((int)(x+0.5),(int)(y+0.5));x+=xIncre;y+=yIncre;}.-}voidCExperiment_Frame_OneView::Mid_Bresenham(intX0,intY0,intX1,intY1){//-------请实现Mid_Bresenham算法-------//intdx,dy,d,UpIncre,DownIncre,x,y,xend;if(X0X1){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(xX1){DrawPixel(x,y);x++;if(d0){y++;d+=UpIncre;}elsed+=DownIncre;}}3.3运行结果.-.-.-3.4运行结果分析DDA算法基本上没有什么问题,Mid_Bresenham算法在网格尺寸比较大时误差较大,通过改变网格尺寸大小即能较为精确地描绘出所绘直线。总之在误差允许的范围类,实验结果令人满意。4思考题(可选)如何测试比较算法的性能?提示1:因为绘制1条直线时间很短,所以需要绘制大量直线才能比较它们之间的性能;提示2:drawpixel需要耗费时间,但它的时间性能和直线绘制算法无关,因此在比较不同算法性能时,应该屏蔽它的影响,如何屏蔽?.-5实验心得通过此次实验,我对典型的直线绘制算法DDA算法、Bresenham中点算法有了进一步的了解与掌握。由于第一次做图形学的相关实验,陌生感还是有的,对平台也不太掌握,所以一开始很难入门,但在老师的帮助和同学的相互讨论下,结果还是可观的。两个基本算法都得以实现。希望随着学习的加深,后续的实验能够做的更好。实验2多边形扫描转换算法1实验目的和要求理解多边形扫描转换的原理;掌握典型多边形扫描转换算法;掌握步处理、分析实验数据的能力;编程实现基本X-扫描线转换算法(必做);编程实现有效边表转换算法(选做)。2实验环境和工具本试验提供自带实验平台开发环境:VisualC++6.0本实验提供名为Polygon_Conversion的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现X-扫描线算法和有效边表转换算法。多边形输入:用户按【功能】【输入多边形……】菜单开始输入多边形;单击鼠标左键输入多边形顶点;点击鼠标右键结束多边形输入,并将最后一个顶点和第一个顶点进行连接;.-参数设置:用户按“【功能】【设置……】”启动设置对话框设置内容:填充色是否填充多边形选择转换算法实现扫描转换算法X-扫描线转换算法:voidCPolygon_ConversionView::X_Scan_Line_Conersion(intVertices[][2],intVertexNum)有效边表转换算法:voidCPolygon_ConversionView::Active_Edge_Table_Conersion(intVertices[][2],intVertexNum)3实验结果3.1程序流程图X-扫描线转换算法:开始(若构点小于3个→结束)↓确定多边形所占有的最大扫描线,得到多边形顶点的最小和最大y值(ymin和ymax)↓从ys=ymin开始扫描,且计算每条边的方程式↓↓←←记录ys与多边形各边交点↑↓(判断并取舍交点:顶点的两条边的另外两个端点的y1,y2的值比ys大的个数为0,1,2,则取交点对应个数为0,1,2;)↓取完交点横坐标后排序交点横坐标x数组,并配对(1,2)(3,4)…↑↑.-↓填充配对区间↓若扫描线ys=ymax→→↑(结束)3.2程序代码voidCPolygon_ConversionView::X_Scan_Line_Conersion(intVertices[][2],intVertexNum){intymin,ymax,x[10],i,j,n=0,x1,x2,y1,y2,x0,ys;ymax=0xffffffff;ymin=0x7fffffff;if(VertexNum=3)return;for(i=0;iVertexNum;++i){if(Vertices[i][1]ymin)ymin=Vertices[i][1];if(Vertices[i][1]ymax)ymax=Vertices[i][1];}for(ys=ymin;ys=ymax;ys++){n=0;for(j=0;jVertexNum;++j){x1=Vertices[j][0];y1=Vertices[j][1];x2=Vertices[(j+1)%VertexNum][0];y2=Vertices[(j+1)%VertexNum][1];if(y1==y2){continue;}if(ysmin(y1,y2)||ysmax(y1,y2))continue;.-x0=int((ys-y1)*(x2-x1)/(y2-y1)+x1+0.5);if(ys==y1)continue;if(ys==y2){inttmp=0;if(y1ys)++tmp;if(Vertices[(j+2)%VertexNum][1]ys)++tmp;if(tmp%2==0)continue;}x[n]=x0;n++;}sort(x,x+n);//排序for(i=0;in;i+=2)//填充{for(j=x[i];j=x[i+1];++j)DrawPixel(j,ys);}}return;}3.3运行结果.-3.4运行结果分析X扫描线算法填充算法中比较简单的算法。它通过求交、排序、交点配对、区间填色的过程一次处理每一条扫描线。而且对于端点独立进行判断(当做一个或者两个),很好的实现了填充效果。4思考题(可选)5实验心得通过此次实验,我对X-扫描线转换算法和有效边表转换算法都有了一定的了解,并能在指导下完成相应的函数的编写。另一方面,我的数据分析和处理能力也得到了一定的提升。正可谓收获匪浅。实验3BSpline曲线绘制1实验目的和要求理解掌握自由曲线生成的基本原理和方法;编程实现三次B样条曲线:均匀周期性B样条曲线开放均匀B样条曲线2实验环境和工具本试验提供自带实验平台开发环境:VisualC++6.0实验平台:Polygon_Conversion(自制平台)3实验结果3.1程序流程图1)基函数的生成:floatCFreeform_CurveView::BKM(floatt,intk,intm,floatnodes[]).-{floatvalue;if(m==1){if(t=nodes[k]&&tnodes[k+1])value=1;elsevalue=0;}elseif(m1){value=(Divide((t-nodes[k]),(nodes[k+m-1]-nodes[k]))*BKM(t,k,m-1,nodes)+Divide((nodes[k+m]-t),(nodes[k+m]-nodes[k+1]))*BKM(t,k+1,m-1,nodes));}returnvalue;}2)生成曲线的节点矢量:boolCFreeform_CurveView::Create_Nodes_Vector(intn,intm,intSplineType,floatnodes[]){switch(SplineType){case0://均匀B样条曲线{//添加代码......................................for(inti=0;i=n+m;i++)nodes[i]=i;break;}case1://开放均匀B样条曲线.-{//添加代码.....................................inti=0;for(;im;i++)nodes[i]=0;for(;i=n;i++)nodes[i]=i-m+1;for(;i=n+3;i++)nodes[i]=n-m+2;break;}default:returnfalse;}returntrue;}3.3运行结果3