计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学
实验报告
姓名:云飞
学号:20112497
班级:计算机科学与技术11-2班实验地点:逸夫楼507
实验时间:2014.03
实验1直线的生成
1实验目的和要求
理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;
编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。
2实验环境和工具
开发环境:Visual C++ 6.0
实验平台:Experiment_Frame_One(自制平台)。
本实验提供名为Experiment_Frame_One的平台,该平台提供基
本绘制、设置、输入功能,学生在此基础上实现
Mid_Bresenham算法,并进行分析。
⏹平台界面:如图2-1所示
⏹设置:通过view->setting菜单进入,如图2-2所示
⏹输入:通过view->input…菜单进入.如图2-3所示
⏹实现算法:
◆DDA算法:void CExperiment_Frame_OneView::DDA(int
X0, int Y0, int X1, int Y1)
Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)
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+UpIncre d=d+DownIncre
↓______.______↓↑↑
↓
若x<=x1 →→→↑
↓
结束
3.2程序代码
void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)
{
//----------请实现DDA算法------------//
int dx,dy,epsl,k;
float x,y,xIncre,yIncre;
dx=X1-X0; dy=Y1-X0;
x=X0; y=Y0;
if(abs(dx)>abs(dy)) epsl=abs(dx);
else epsl=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;
}
}
void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)
{
//-------请实现Mid_Bresenham算法-------//
int dx,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; } else d+=DownIncre; } } 3.3运行结果