1、1实验二 直线段生成绘制的实现算法班级 信计二班 学号 20080502077 姓名 王承宇 分数 一、实验目的和要求:1、了解 Visual C+等编程环境中常用控件命令与绘图函数,初步掌握在试验设计集成下进行图形处理程序的设计方法。2、熟练掌握直线的 3 中扫描转换算法:DDA 算法,中点算法和Bresenham 算法。二、实验内容:1、编程实现 DDA 算法、Bresenham 算法、中点递归算法绘制直线段。2、分析对比三种算法的像素逼近效果和程序执行速度 。3、输出要求:每种算法要分别在八个二分之一象限内画一条直线段。三、实验结果分析:1、该程序实现了三种算法的直线段绘制。2、比较三种
2、算法的结果:像素逼近效果由好到差依次为:Bresenham 算法、DDA 算法、中点算法。执行速度由快到慢依次为:中点算法、DDA 算法、Bresenham 算法。3、中点算法和 Bresenham 算法都隐含着对逼近过程中误差项的处理,这样就使得直线生成更准确。四、程序代码:1、基于 DDA 算法画任一斜率的直线:#include #include / 四舍五入int Round(float x)return (int)(x abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1);2x = (float)x1;y = (float)y1;cx = (float)
3、(x2 - x1) / steps;cy = (float)(y2 - y1) / steps;for(int i = 0; i #include / 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Midpoint(int x1, int y1, int x2, int y2, int color)int x = x1, y = y1;int a = y1 - y2, b = x2 - x1;int cx = (b = 0 ? 1 : (b = -b, -1);int cy = (a 1d = 2 * b + a; d1 = 2 * b;d2 = 2 * (a +
4、 b);while(y != y2) if(d #include / 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Bresenham(int x1, int y1, int x2, int y2, int color)int x = x1;int y = y1;int dx = abs(x2 - x1);int dy = abs(y2 - y1);int s1 = x2 x1 ? 1 : -1;int s2 = y2 y1 ? 1 : -1;bool interchange = false; / 默认不互换 dx、dyif (dy dx) /
5、当斜率大于 1 时,dx、dy 互换int temp = dx;dx = dy;dy = temp;interchange = true;6int p = 2 * dy - dx;for(int i = 0; i = 0)if (!interchange) / 当斜率 1 时,选取左右象素点x += s1;p -= 2 * dx;if (!interchange)x += s1; / 当斜率 1 时,选取 y 为步长p += 2 * dy;/ 主函数void main()initgraph(640, 480);/ 测试画线Line_Bresenham(100, 1, 1, 478, GREEN);Line_Bresenham(1, 478, 638, 1, GREEN);/ 按任意键退出getch();closegraph();输出结果为:7