1、计算机图形学实验报告计算机图形学实验报告*学 号: * 班 级: 计算机科学与技术11-2班 实验地点: 逸夫楼507 实验时间: 2021.03 实验1 直线的生成1实验目的和要求理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进展批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比拟两种算法的性能。2实验环境和工具 开发环境:Visual C+ 6.0 实验平台:Experiment_Frame_
2、One自制平台。 本实验提供名为 Experiment_Frame_One的平台,该平台提供根本绘制、设置、输入功能,学生在此根底上实现DDA算法和Mid_Bresenham算法,并进展分析。平台界面:如图 21所示设 置:通过view-setting菜单进入,如图 22所示输 入:通过view-input菜单进入.如图 23所示实现算法:DDA算法:void CExperiment_Frame_OneView:DDA(int X0, int Y0, int X1, int Y1)Mid_Bresenham法:void CExperiment_Frame_OneView:Mid_Bresenh
3、am(int X0, int Y0, int X1, int Y1)3实验结果3.1程序流程图1DDA算法流程图: 开场定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增量xIncre,y增量yIncre输入两点坐标x1,y1,x0,y0dx=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; 假设kx1 反之x=x1;x1=x0;x0=x; x=x0; Y=y1;y1=
4、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+UpIncre d=d+DownIncre. 假设xabs(dy) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;kX1) x=X1;X1=X0;X0=x; y=Y1;Y1=Y0;Y0=y; x=X0;y=Y
5、0; 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; else d+=DownIncre; 3.3运行结果3.4运行结果分析 DDA算法根本上没有什么问题,Mid_Bresenham算法在网格尺寸比拟大时误差较大,通过改变网格尺寸大小即能较为准确地描绘出所绘直线。总之在误差允许的围类,实验结果令人满意。4思考题可选如何测试比拟算法的性能?提示1:因为绘制1条直线时间很短,所以需要绘制大量直线才能比拟它们之
6、间的性能;提示2: drawpixel需要消耗时间,但它的时间性能和直线绘制算法无关,因此在比拟不同算法性能时,应该屏蔽它的影响,如何屏蔽?5实验心得通过此次实验,我对典型的直线绘制算法DDA算法、Bresenham中点算法有了进一步的了解与掌握。由于第一次做图形学的相关实验,陌生感还是有的,对平台也不太掌握,所以一开场很难入门,但在教师的帮助和同学的相互讨论下,结果还是可观的。两个根本算法都得以实现。希望随着学习的加深,后续的实验能够做的更好。实验2多边形扫描转换算法1实验目的和要求理解多边形扫描转换的原理;掌握典型多边形扫描转换算法;掌握步处理、分析实验数据的能力;编程实现根本X-扫描线转
7、换算法必做;编程实现有效边表转换算法选做。2实验环境和工具本试验提供自带实验平台 开发环境:Visual C+ 6.0本实验提供名为 Polygon_Conversion的平台,该平台提供根本绘制、设置、输入功能,学生在此根底上实现X-扫描线算法和有效边表转换算法。多边形输入:用户按【功能】 【输入多边形】菜单开场输入多边形;单击鼠标左键输入多边形顶点;点击鼠标右键完毕多边形输入,并将最后一个顶点和第一个顶点进展连接;参数设置:用户按“【功能】 【设置】启动设置对话框设置容:填充色是否填充多边形选择转换算法实现扫描转换算法X-扫描线转换算法:void CPolygon_ConversionVi
8、ew:X_Scan_Line_Conersion(int Vertices2, int VertexNum)有效边表转换算法:void CPolygon_ConversionView:Active_Edge_Table_Conersion(int Vertices2, int VertexNum)3实验结果3.1程序流程图X-扫描线转换算法: 开场(假设构点小于3个完毕)确定多边形所占有的最大扫描线,得到多边形顶点的最小和最大y值(ymin和 ymax)从ys=ymin开场扫描,且计算每条边的方程式 记录ys与多边形各边交点 (判断并取舍交点:顶点的两条边的另外两个端点的y1,y2的值比ys大
9、的个数为0,1,2,那么取交点对应个数为0,1,2;) 取完交点横坐标后排序交点横坐标x数组, 并配对1,23,4填充配对区间 假设扫描线ys=ymax (完毕)3.2程序代码void CPolygon_ConversionView:X_Scan_Line_Conersion(int Vertices2, int VertexNum) int ymin,ymax,x10,i,j,n=0,x1,x2,y1,y2,x0,ys; ymax=0xffffffff; ymin=0x7fffffff; if(VertexNum=3) return; for(i=0;iVertexNum;+i) if(Ve
10、rticesi1ymax) ymax=Verticesi1; for(ys=ymin;ys=ymax;ys+) n=0; for(j=0;jVertexNum;+j) x1=Verticesj0; y1=Verticesj1; x2=Vertices(j+1)%VertexNum0; y2=Vertices(j+1)%VertexNum1; if(y1=y2) continue ; if(ysmax(y1,y2) continue; x0=int(ys-y1)*(x2-x1)/(y2-y1)+x1+0.5); if(ys=y1) continue; if(ys=y2) int tmp=0; i
11、f(y1ys) +tmp; if(Vertices(j+2)%VertexNum1ys) +tmp; if(tmp%2=0) continue; xn=x0; n+; sort(x,x+n);/排序 for(i=0;in;i+=2) /填充 for(j=xi;j= nodesk&t 1) value= (Divide(t-nodesk),(nodesk+m-1-nodesk)*BKM(t,k,m-1,nodes)+ Divide(nodesk+m-t),(nodesk+m-nodesk+1)*BKM(t,k+1,m-1,nodes); return value;2生成曲线的节点矢量:bool
12、CFreeform_CurveView:Create_Nodes_Vector(int n, int m, int SplineType, float nodes) switch(SplineType) case 0: /均匀B样条曲线 /添加代码. for(int i=0;i=n+m;i+) nodesi=i; break; case 1: /开放均匀B样条曲线 /添加代码. int i=0; for(;im;i+) nodesi=0; for(;i=n;i+) nodesi=i-m+1; for(;i=n+3;i+) nodesi=n-m+2; break; default: return false; return true;3.3运行结果3.4运行结果分析这次试验是照着书上的生成曲线的公式编写的,分别绘制出均匀B样条曲线和开放均匀B样条曲线,实现难度不大。从曲线可以看出,两个曲线都很好的拟合了选择的点,均匀B样条曲线似乎效果更佳。 4实验心得 通过此次实验,我对根本曲线生成算法有了一定的掌握。由于其本身就很掌握,所以实现起来困难重重。可能是对三次B样条曲线的理解还不够透彻,希望今后的学习能够让我对其有进一步的了解与把握。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1