一:DDA算法
(一)什么是DDA
在计算机图形中主要用来绘制直线,相对于其他算法,原理相对简单,主要是利用直线方程 y=kx+b 对任意直线进行扫描转化。
(二)DDA基本算法思想
- 已知直线的两个端点(x0,y0) (x1,y1)
- 确定扫描的主位移方向并计算steps=max((x1-x0),(y1-y0))
- 分别计算x和y的偏移量dx,dy
- 通过迭代的思想,不断更新起点的坐标
(三)DDA存在的缺陷
- 由于取得的点是理想值,所以要将点的坐标四舍五入
- 四舍五入操作和浮点数操作导致运算效率低下
- 不太适合硬件生产线
(四)代码实现
void DDA_DrawLIne(int x0, int y0,int x1,int y1)
{
double x,y,dx,dy;
double steps;
int color=RGB(255,0,0);
steps=fabs(x1-x0)>fabs(y1-y0)?fabs(x1-x0):fabs(y1-y0);
dx=(x1-x0)/steps;
dy=(y1-y0)/steps;
x=x0;
y=y0;
CDC *pDC=GetDC();
for(int i=0;i<steps;i++)
{
// 对x,y分别进行四舍五入取得最佳逼近像素
pDC->SetPixel(int(x+0.5),int(y+0.5),color);
//更新点的坐标
x+=dx;
y+=dy;
}
ReleaseDC(pDC);
}
二:Bresenham算法
(一)什么是Bresenham
依据计算机图形学中显示器的像素点的特性,将以整数的形式对点的坐标进行计算,预估下一个点的位置,构造方程F(x,y)=y-kx-b 并将它作为判别式。
(二)Bresenham基本算法思想
依据k值的范围划分为8中情况,如下图
d0=0.5-k; e0=dx-2*dy
d>=0时d=d-k ; x=x+1; e>=0时 e=e-2*dy; x=x+1;
d<0时 d=d+1-k; x=x+1; y=y+1; e<0时 e=e+2*dx-2*dy; x=x+1; y=y+1;
d0=1+0.5k e0=2*dx+dy; (注意:dx为负值,两边同乘不等式变号)
d>=0时 d=d+1+k; y=y+1; x=x-1; e<=0时 e=e+2*dx+2*dy; y=y+1; x=x-1;
d<0时 d=d+1; y=y+1; e>0时 e=e+2*dx; y=y+1;
d0=0.5+k; e0=dx+2*dy; (同样,dx为负值)
d>=0时 d=d+k; x=x-1; e<=0时 e=e+2*dy; x=x-1;
d<0时 d=d+1+k; x=x-1; y=y+1; e>0时 e=e+2*dx+2*dy; x=x-1; y=y+1;
d0=k-0.5; e0=2*dy-dx; (dx为负值)
d>=0时 d=d+k-1; x=x-1; y=y-1; e<=0时 e=e+2*dy-2*dx; x=x-1; y=y-1;
d<0时 d=d+k; x=x-1; e>0时 e=e+2*dy; x=x-1;
d0=0.5k-1; e0=dy-2*dx; ( dx为负值)
d>=0时 d=d-1; y=y-1; e<=0时 e=e-2*dx; y=y-1;
d<0时 d=d+k-1; y=y-1; x=x-1; e>0时 e=e+2*dy-2*dx; y=y-1; x=x-1;
d0=-1-0.5k; e0=-2*dx-dy;
d>=0时 d=d-1; y=y-1; e>=0时 e=e-2*dx; y=y-1;
d<0时 d=d-1-k; y=y-1; x=x+1; e<0时 e=e-2*dx-2*dy; y=y-1; x=x+1;
d0=-0.5-k; e0=-dx-2*dy;
d>=0时 d=d-1-k; x=x+1; y=y-1; e>=0时 e=e-2*dx-2*dy; x=x+1; y=y-1;
d<0时 d=d-k; x=x+1; e<0时 e=e-2*dy; x=x+1;
(三)代码实现
void Bresenham_Line(int x0, int y0, int x1, int y1)
{
int x,y=y0;
double k,d;
k=(y1-y0)/(x1-x0);
CDC *pDC=GetDC();
d=0.5-k;
for(x=x0;x<x1;x++)
{
pDC->SetPixel(x,y,RGB(255,0,0));
if(d>=0) d=d-k;
else{
d=d+1-k;
y+=1;
}
}
ReleaseDC(pDC);
}