Bresenham算法是一系列算法。
首先我们要了解一个事实,实际的描点坐标都是整数的。而公式计算浮点的是浮点数。
算法核心思想:已知当前点坐标及曲(直)线方程,递推下一个(x+1)点的y坐标(或者(y+1)点的x坐标)。抛弃使用三角函数计算坐标,提高数据重用率。
1.DDA画线算法
核心:直线方程 y=kx+b;
当前坐标和下一个坐标的关系。
xn=xn−1+1;
yn=round(yn−1+k);
void DDALine(int x0,int y0,int xEnd,int yEnd)
{
int dx = xEnd - x0;
int dy = yEnd - y0;
int step , k;
float xi,yi;
if(abs(dx)>abs(dy)) step = abs(dx);
else step = abs(dy);//确定哪个是单位坐标。
xi = dx/step;//假如x坐标是单位坐标,则xi为1;
yi = dy/step;
setPixel(x0,y0,0);//c
//c++ MFC下:SetPixel(hdc,x0,y0,0);貌似有效率问题。
//c++ pDC->SetPixel(x0,y0,0);
for(k=0;k<step;k++){
x0+=xi;
y0+=yi; //下一个点
setPixel(round(x0),round(y0),0);
}
{
2.Bresenham画线算法
核心:在DDA算法基础上,抛弃浮点运算,增加一个决策参数p(变化的)。
用公式计算的
dlow=y−yi=m(xk+1)+b−yi
dup=(yi+1)−y=y