完整word版计算机图形学实验报告 2docWord下载.docx
- 文档编号:17141475
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:15
- 大小:172.51KB
完整word版计算机图形学实验报告 2docWord下载.docx
《完整word版计算机图形学实验报告 2docWord下载.docx》由会员分享,可在线阅读,更多相关《完整word版计算机图形学实验报告 2docWord下载.docx(15页珍藏版)》请在冰豆网上搜索。
input…菜单进入.如图23所示
⏹实现算法:
◆DDA算法:
voidCExperiment_Frame_OneView:
:
DDA(intX0,intY0,intX1,intY1)
Mid_Bresenham法:
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程序代码
{
//----------请实现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;
}
}
//-------请实现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;
y=Y0;
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多边形扫描转换算法
理解多边形扫描转换的原理;
掌握典型多边形扫描转换算法;
编程实现基本X-扫描线转换算法(必做);
编程实现有效边表转换算法(选做)。
本试验提供自带实验平台
本实验提供名为Polygon_Conversion的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现X-扫描线算法和有效边表转换算法。
多边形输入:
⏹用户按【功能】【输入多边形……】菜单开始输入多边形;
⏹单击鼠标左键输入多边形顶点;
⏹点击鼠标右键结束多边形输入,并将最后一个顶点和第一个顶点进行连接;
●参数设置:
⏹用户按“【功能】【设置……】”启动设置对话框
⏹设置内容:
◆填充色
◆是否填充多边形
◆选择转换算法
⏹实现扫描转换算法
◆X-扫描线转换算法:
voidCPolygon_ConversionView:
X_Scan_Line_Conersion
(intVertices[][2],intVertexNum)
◆有效边表转换算法:
Active_Edge_Table_Conersion
X-扫描线转换算法:
(若构点小于3个→结束)
确定多边形所占有的最大扫描线,
得到多边形顶点的最小和最大y值(ymin和ymax)
从ys=ymin开始扫描,且计算每条边的方程式
↓↓←←
记录ys与多边形各边交点↑
(判断并取舍交点:
顶点的两条边的另外两个端点的y1,y2的值比ys大的个数为0,1,2,
则取交点对应个数为0,1,2;
)
取完交点横坐标后排序交点横坐标x数组,
并配对(1,2)(3,4)…↑↑
填充配对区间
若扫描线ys<
=ymax→→↑
(结束)
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<
VertexNum;
++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;
j<
++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<
min(y1,y2)||ys>
max(y1,y2))
continue;
x0=int((ys-y1)*(x2-x1)/(y2-y1)+x1+0.5);
if(ys==y1)
if(ys==y2)
inttmp=0;
if(y1>
ys)
++tmp;
if(Vertices[(j+2)%VertexNum][1]>
if(tmp%2==0)
continue;
x[n]=x0;
n++;
}
sort(x,x+n);
//排序
for(i=0;
n;
i+=2)//填充
for(j=x[i];
=x[i+1];
DrawPixel(j,ys);
return;
X扫描线算法填充算法中比较简单的算法。
它通过求交、排序、交点配对、区间填色的过程一次处理每一条扫描线。
而且对于端点独立进行判断(当做一个或者两个),很好的实现了填充效果。
通过此次实验,我对X-扫描线转换算法和有效边表转换算法都有了一定的了解,并能在指导下完成相应的函数的编写。
另一方面,我的数据分析和处理能力也得到了一定的提升。
正可谓收获匪浅。
实验3BSpline曲线绘制
●理解掌握自由曲线生成的基本原理和方法;
编程实现三次B样条曲线:
●均匀周期性B样条曲线
●开放均匀B样条曲线
●开发环境:
●实验平台:
Polygon_Conversion(自制平台)
1)基函数的生成:
floatCFreeform_CurveView:
BKM(floatt,intk,intm,floatnodes[])
{
floatvalue;
if(m==1)
if(t>
=nodes[k]&
&
t<
nodes[k+1])
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;
=n+m;
i++)
nodes[i]=i;
break;
case1:
//开放均匀B样条曲线
//添加代码.....................................
inti=0;
for(;
m;
i++)
nodes[i]=0;
=n;
nodes[i]=i-m+1;
=n+3;
nodes[i]=n-m+2;
default:
returnfalse;
returntrue;
这次试验是照着书上的生成曲线的公式编写的,分别绘制出均匀B样条曲线和开放均匀B样条曲线,实现难度不大。
从曲线可以看出,两个曲线都很好的拟合了选择的点,均匀B样条曲线似乎效果更佳。
4实验心得
通过此次实验,我对基本曲线生成算法有了一定的掌握。
由于其本身就很掌握,所以实现起来困难重重。
可能是对三次B样条曲线的理解还不够透彻,希望今后的学习能够让我对其有进一步的了解与把握。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整word版计算机图形学实验报告 2doc 完整 word 计算机 图形学 实验 报告 doc