DDA算法的本质就是在绘制直线时,根据直线的斜率采样不同的像素点,如果斜率小于1,在x轴以单位1递进采样像素点;如果斜率大于1,在y轴以单位1递进采样像素点。
y2=mx2+b
y1=mx1+b
y2-y1=m(x2-x1)
1、当m的绝对值小于等于1,采样时x2-x1=1,y2=y1+m,注意m是有符号的
2、当m的绝对值大于1,采样时y2-y1=1,x2=1/m+x1,注意m是有符号的
y2=mx2+b
y1=mx1+b
y2-y1=m(x2-x1)
1、当m的绝对值小于等于1,采样时x2-x1=1,y2=y1+m,注意m是有符号的
2、当m的绝对值大于1,采样时y2-y1=1,x2=1/m+x1,注意m是有符号的
int round(const float a)
{
return (int)(a+0.5);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx=xEnd-x0,dy=yEnd-y0,steps,k;
float xIncrement,yIncrement,x=x0,y=y0;
if(fabs(dx)>=fabs(dy))//斜率小于1
steps=fabs(dx);
else
steps=fabs(dy);//斜率大于1
xIncrement=(float)(dx)/(float)(steps);//获取采样增量步长,当斜率小于1,x轴步长1
yIncrement=(float)(dy)/(float)(steps);//获取采样增量步长,当斜率大于1,y轴步长1
SetPixel(round(x),round(y));//绘制采样点
for(k=0;k<steps;k++)
{
x+=xIncrement;
y+=yIncrement;
SetPixel(round(x),round(y));
}
}