直线的扫描转换就是确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。
通常有数值微分法(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
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; } } }