计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》实验报告姓名:郭子玉
学号:2012211632
班级:计算机12-2班
实验地点:逸夫楼507
实验时间:15.04.10 15.04.17
实验一
1 实验目的和要求
理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;
编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。
2 实验环境和工具
开发环境:Visual C++ 6.0
实验平台:Experiment_Frame_One (自制平台)
3 实验结果
3.1 程序流程图
(1)DDA 算法
是 否 否
是 是
开始
计算k ,b K<=1 x=x+1;y=y+k;
绘点 x<=X1
y<=Y1
绘点
y=y+1;x=x+1/k;
结束
(2)Mid_Bresenham 算法
是 否
否
是 是
是 否 是 否
开始
计算dx,dy dx>dy D=dx-2*dy
绘点 D<0
y=y+1;D = D +
2*dx -
2*dy; x=x+1;
D = D - 2*dy; x=x+1;
x D=dy-2*dx y 绘点 D<0 D = D - 2*dx; y=y+1; x=x+1;D = D + 2*dy - 2*dx; y=y+1; 结束 3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; } int x; float y; x = (int)X0; y = (float)Y0; while(x <= X1) { DrawPixel(x, round(y)); x ++; y = y + k; } } else { if(Y0 > Y1) { int temp = Y0; Y0 = Y1; Y1 = temp; } float x; int y; x = (float)X0; y = (int)Y0; while(y <= Y1) { DrawPixel(round(x), y); y ++; x = x + 1/k; } } return; } (2)Mid_Bresenham算法 void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1) { //-------请实现Mid_Bresenham算法-------// int D; int dx, dy; int x, y; dx = X1 - X0; dy = Y1 - Y0; x = X0; y = Y0; if(dx > dy) { while(x <= X1) { DrawPixel(x, y); if(D < 0) { y = y +1; D = D + 2*dx - 2*dy; } else { D = D - 2*dy; } x++; } } else { D = dy - 2*dx; while(y <= Y1) { DrawPixel(x, y); if(D < 0) { D = D + 2*dy - 2*dx; } else { D = D - 2*dx; } y++; } } return; } 3.3运行结果 (1)DDA算法