1、实验二 直线段生成绘制的实现算法
班级 08信计二 学号 20080502075 姓名 石志涛 分数
一、实验目的和要求:
1、掌握光栅图形显示基本原理。
2、熟悉直线的生成算法,掌握直线的绘制。
3、掌握几种常用的直线生成算法。
4、利用Visual C++ 实现直线生成的DDA算法、Bresenham算法。
二、实验内容:
1、了解直线的生成原理,掌握几种基本的直线生成算法。
2、编程实现DDA算法、Bresenham算法绘制直线段。
3、分析对比两种算法的像素逼近效果和程序执行速度。
4、输出要求:每种算法要分别在八个二分之一象
2、限内画一条直线段。
三、实验步骤:
1、预习教材关于直线的生成原理。
2、仿照教材关于直线生成的DDA算法和Bresenham算法,使用Visual C++ 实现该算法。
3、运行结果的调试。
程序代码
1.DDA算法:
#include
#include
void linedda(int x0,int y0,int x1,int y1,int color)
{
int x,dy,dx, y;
float m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
for(x=x0;x<=x1;x++)
3、
{
putpixel(x,(int)(y+0.5),color);
y+=m;
}
}
main()
{
int a,b,c,d,e;
int graphdriver=DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode," ");
cleardevice();
a=0;
b=0;
c=200;
d=300;
e=RGB(0,255,0);
linedda(a,b,c,d,e);
getch();
closegraph();
}
运行结果:
2.Bresenham算法
4、
#include
#include
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;
if (dy > dx)
{
i
5、nt temp = dx;
dx = dy;
dy = temp;
interchange = true;
}
int p = 2 * dy - dx;
for(int i = 0; i < dx; i++)
{
putpixel(x, y, color);
if (p >= 0)
{
if (!interchange)
y += s2;
else
x += s1;
p -= 2 * dx;
}
if (!interchange)
x += s1;
el
6、se
y += s2;
p += 2 * dy;
}
}
void main()
{
initgraph(640, 480);
Line_Bresenham(100, 1, 1, 478, GREEN);
Line_Bresenham(1, 478, 638, 1, GREEN);
getch();
closegraph();
}
运行结果:
四、实验结果分析:
1、DDA算法采用的是直线的点斜式计算公式
2、Bresenham算法是通过选择与理想直线最近的像素来完成扫描转换的。
通过该课程的学习使我熟练的掌握了利用计算机画直线的方法,在老师的教导下掌握了许多的计算机图形学知识,为以后利用计算机画图形打下了基础。
4