




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文库计算机图形学实验报告姓 名: 郭子玉 学 号: 2012211632 班 级: 计算机12-2班 实验地点: 逸夫楼507 实验时间: 15.04.10 15.04.17 欢迎下载实验一1 实验目的和要求理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。2 实验环境和工具开发环境:Visual C+ 6.0实验平台:Experiment_Frame_One(自制平台)3 实验结果3.1 程序流程图开始(1)DDA算法计算k,bK=1x=X1ydyD=dy-2*dxD=dx-2*dy 是 否yY1;xX1; 否是 是结束绘点绘点 D0 D0 是 否x=x+1;D = D + 2*dy - 2*dx;y=y+1;D = D - 2*dx;y=y+1;y=y+1;D = D + 2*dx - 2*dy;x=x+1;D = D - 2*dy;x=x+1;是 否3.2 程序代码/-算法实现-/绘制像素的函数DrawPixel(x, y);(1) DDA算法void CExperiment_Frame_OneView:DDA(int X0, int Y0, int X1, int Y1)/-请实现DDA算法-/float k, b;float d;k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0);if(fabs(k) X1)int temp = X0;X0 = X1;X1 = temp;int x;float y;x = (int)X0; y = (float)Y0;while(x Y1)int temp = Y0;Y0 = Y1;Y1 = temp;float x;int y;x = (float)X0;y = (int)Y0;while(y dy) D = dx - 2*dy;while(x = X1) DrawPixel(x, y);if(D 0) y = y +1;D = D + 2*dx - 2*dy;else D = D - 2*dy;x+;else D = dy - 2*dx;while(y = Y1) DrawPixel(x, y);if(D 0) x = x +1;D = D + 2*dy - 2*dx;else D = D - 2*dx;y+;return;3.3 运行结果(1)DDA算法(2)Mid_Bresenham算法3.4 运行结果分析DDA算法直观,实现简单。但是涉及浮点数运算,不利于硬件实现。Mid_Bresenham算法比DDA算法简单。两种算法实现生成的直线也可能会有不同。4 实验心得 通过实验,学习掌握了两种直线的扫描转换算法。不同方法有不同的优点,实现结果也有可能不同。需要通过比较,确定哪种方法更优,更符合正确结果。实验二1 实验目的和要求理解多边形扫描转换的原理;掌握典型多边形扫描转换算法;掌握步处理、分析实验数据的能力;编程实现基本X-扫描线转换算法(必做);2 实验环境和工具 开发环境:Visual C+ 6.0实验平台:Polygon_Conversion(自制平台)3 实验结果3.1 程序流程图X-扫描线转换算法开始计算xmax,ymax绘点扫描线与各线段是否有交点x排序根据公式求交点,记录交点是否为线段的第一个顶点 是 判断不同类型的顶点,记录交点 否 是3.2 程序代码/*功能:X-扫描线转换算法参数说明: vertices2-顶点列表 VertexNum -顶点数目备注: DrawPixel(int x, int y) -绘制像素点(x, y)*/void CPolygon_ConversionView:X_Scan_Line_Conersion(int Vertices2, int VertexNum)int ymax, ymin,count;float k;ymax=Vertices01;ymin=Vertices01;for(int p =0 ; p ymax) ymax=Verticesp1;if(Verticesp1 ymin) ymin=Verticesp1;int Xn100, i, ymax2, ymin2, temp;for( i = ymin ; i = ymax ; i+) /求交点count=0;for( int j = 0; j Vertices01) /线段的y最大值与最小值ymax2=Verticesj1;ymin2=Vertices01;elseymax2=Vertices01;ymin2=Verticesj1;if(iymin2) /判断交点是否在线段上k= (float) ( (float)(Verticesj0-Vertices00) / (float)(Verticesj1-Vertices01) );Xncount=(int) ( (k * (float)i - k *(float) Vertices01 + (float)Vertices00) + 0.5);count+;else if( i = Verticesj1 ) /扫描线经过线段顶点,只算前一个顶点if( (Verticesj-11 i) & (Vertices01 i)Xncount=Verticesj0;count+;Xncount=Verticesj0;count+;else if( (Verticesj-11 i) | (Verticesj-11 i) & (Vertices01 Verticesj+11)ymax2=Verticesj1;ymin2=Verticesj+11;elseymax2=Verticesj+11;ymin2=Verticesj1;if(iymin2)k= (float) ( (float) (Verticesj0-Verticesj+10) / (float) (Verticesj1-Verticesj+11) );Xncount=(int) ( (k *(float) i - k * (float)Verticesj+11 + Verticesj+10) + 0.5);count+;else if( i = Verticesj1 ) /扫描线经过线段顶点,只算前一个顶点if(j != 0) /交点不为第一和最后一点if( (Verticesj-11 i) & (Verticesj+11 i)Xncount=Verticesj0;count+;Xncount=Verticesj0;count+;else if( (Verticesj-11 i) | (Verticesj-11 i) & (Verticesj+11 i) & (Verticesj+11 i)Xncount=Verticesj0;count+;Xncount=Verticesj0;count+;else if( (VerticesVertexNum-11 i) | (VerticesVertexNum-11 i) & (Verticesj+11 i) ) Xncount=Verticesj0;count+;for( int m = 0; m count-1; m+ ) /交点x坐标排序for( int n = m+1; n Xnn )temp=Xnm;Xnm=Xnn;Xnn=temp;for( int a = 0; a count; a+=2 ) /绘制像素点for( int b = Xna; b Xna+1; b+)Dr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论