学习了三种常用的直线扫描转换算法 :数值微分法(DDA)、中点画线法和Bresenham画线算法.
注 : 本文中的程序都是假定斜率在0~1之间,其他斜率类似,做相应的简单处理就好。
数值微分法(DDA, Digital Differential Analyzer)
直线扫描转换最简单的方法是先算出直线的斜率:
k = △y / △x
△x = x1 - x0,△y = y1 - y0, (x0, y0)和(x1, y1)是线段的两个端点坐标。然后从线的起点开始,确定最近逼近于直线的y坐标。假设端点坐标都为整数,让x从起点开始到终点,步增为1,计算对应的y坐标,y = kx + B,并取像素(x, round(y))。用这种方法可行、直观,但是效率很差,因为
每步运算都需要一个浮点乘法和一个舍入运算。
yi+1 = kxi+1 + B
= k(xi + △x) + B
= kxi + B + k△x
= yi + k△x
因此,当△x = 1时,有yi+1 = yi + k,每当x步增1,y递增k。
DDA算法程序为:
int round(float a) { return int(a + 0.5); }
void DDAline(int x0, int y0, int x1, int y1, int color)
{
int x;
float dx, dy, k, y;
dx = x1 - x0;
dy = y1 - y0;
k = dx / dy;
y = y0;
for (x = x0; x <= x1; ++x)
{
DrawPixel(x, round(y), color);
y = y + k;
}
}