计算机的图形学实验报告材料.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(xDrawPixel(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(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(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]&&tvalue=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(;inodes[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样条曲线的理解还不够透彻,希望今后的学习能够让我对其有进一步的了解与把握。