计算机的图形学实验报告材料.docx
- 文档编号:25667789
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:17
- 大小:172.64KB
计算机的图形学实验报告材料.docx
《计算机的图形学实验报告材料.docx》由会员分享,可在线阅读,更多相关《计算机的图形学实验报告材料.docx(17页珍藏版)》请在冰豆网上搜索。
计算机的图形学实验报告材料
计算机图形学
实验报告
姓名:
谢云飞
学号:
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算法,并进行分析。
⏹平台界面:
如图21所示
⏹设置:
通过view->setting菜单进入,如图22所示
⏹输入:
通过view->input…菜单进入.如图23所示
⏹实现算法:
◆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
______↓______
↓↓
若x0>x1反之
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;
______↓______←←←
↓↓↑
若d<0反之
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(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 DrawPixel(x,y); x++; if(d<0){ 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;i { if(Vertices[i][1] ymin=Vertices[i][1]; if(Vertices[i][1]>ymax) ymax=Vertices[i][1]; } for(ys=ymin;ys<=ymax;ys++) { n=0; for(j=0;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(ys continue; x0=int((ys-y1)*(x2-x1)/(y2-y1)+x1+0.5); if(ys==y1) continue; if(ys==y2) { inttmp=0; if(y1>ys) ++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;i { 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]&&t value=1; else value=0; } elseif(m>1) { 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(;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.4运行结果分析 这次试验是照着书上的生成曲线的公式编写的,分别绘制出均匀B样条曲线和开放均匀B样条曲线,实现难度不大。 从曲线可以看出,两个曲线都很好的拟合了选择的点,均匀B样条曲线似乎效果更佳。 4实验心得 通过此次实验,我对基本曲线生成算法有了一定的掌握。 由于其本身就很掌握,所以实现起来困难重重。 可能是对三次B样条曲线的理解还不够透彻,希望今后的学习能够让我对其有进一步的了解与把握。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告 材料