直线的扫描转换就是确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。
通常有数值微分法(DDA)、中点画线法、Bresenham算法这三个算法。
数值微分法(DDA):
void LineDDA ( int x0,int y0,int x1,int y1,int color)
{
int x,y;
float dx,dy,k;
dx= float(x1-x0);
dy= float(y1-y0);
k=dy/dx;
if(abs(k)<1)
{
for(x=x0; x<=x1, x++)
{
Setpixel(x, int(y+0.5), color);
y+=k;
}
}
else
{
for(y=y0; y<=y1, y++)
{
Setpixel(int(x+0.5),y,color);
x+=1/k;
}
}
}
中点画线法:
MidPointLine(x0,y0,x1,y1,color)
{
int x0,y0,x1,y1,color;
int a,b,d,d1,d2,x,y;
a = y0-y1;b = x1-x0;
d = 2 * a +b;
d1 = 2*a;d2 = 2*(a+b);
x = x0;y = y0;
Setpixel(x,y,color);
while(x<x1)
{
if(d<0)
{
x++; y++; d+=d2;
}
else
{
x++; d+=d1;
}
Setpixel(x,y,color);
}
}
Bresenham算法:
void InterBresenhamline(int x0,int y0,int x1, int y1,int color)
{
int dx,dy,x,y,i;
float e;
dx = x1-x0; dy = y1- y0;
e=-dx;
x=x0; y=y0;
for(i=0; i<= dx; i++)
{
Setpixel(x, y, color);
x++;
e=e+2*dy;
if(e>=0)
{
y++;
e=e-2*dx;
}
}
}