计算机图形学 实验报告
姓 名:学 号:班 级:实验地点:实验时间:
谢云飞 20112497
计算机科学与技术11-2班 逸夫楼507 2014.03
实验1 直线的生成
1 实验目的和要求
理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;
编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。
2 实验环境和工具
开发环境:Visual C++ 6.0
实验平台:Experiment_Frame_One(自制平台)。
本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham算法,并进行分析。
? 平台界面:如错误!未找到引用源。所示
? 设 置:通过view->setting菜单进入,如错误!未找到引
用源。所示
? 输 入:通过view->input…菜单进入.如错误!未找到引用
源。所示 ? 实现算法:
? 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算法------------// float x,y,xIncre,yIncre; dx=X1-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; }
DrawPixel((int)(x+0.5),(int)(y+0.5)); x+=xIncre; y+=yIncre;
dy=Y1-X0;
int dx,dy,epsl,k;
for(k=0;k<=epsl;k++){
}
void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1) { }
if(X0>X1){ }
x=X0;y=Y0;
dx=X1-X0;dy=Y1-Y0; d=dx-2*dy;
UpIncre=2*dx-2*dy; DownIncre=-2*dy; while(x else d+=DownIncre; } DrawPixel(x,y); x++; if(d<0){ y++; d+=UpIncre; x=X1;X1=X0;X0=x; y=Y1;Y1=Y0;Y0=y; //-------请实现Mid_Bresenham算法-------// int dx,dy,d,UpIncre,DownIncre,x,y,xend; 3.3 运行结果