版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82915582
在数学上,理想的直线是没有宽度的,它是由无数个点构成的集合。对直线进行光栅化时,只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近该直线的一组像素,并且按扫描线排序。
中点画线法:通过观察发现,画直线段的过程中,当前像素点为(Xp,Yp),下一个像素点有两种可选择点P1(Xp+1,Yp)或P2(Xp+1,Yp+1)。若M=(Xp+1,Yp+0.5)为P1与P2的中点,Q为理想直线与X=Xp+1垂线的交点,当M在Q的下方时,P2应为下一个像素点,当M在Q的上方时,应取P1为下一点。
运行结果:
实现过程使用MFC实现的。
实现方法:
其中(x0,y0)为起始点,(x1,y1)为终点,color为颜色值。
void CDrawView::MiddleDrawline(int x0,int y0,int x1,int y1,int color)
{
//中点划线算法
//d>0 中点在直线上方 d<0 中点在直线下方
CClientDC dc(this);
int a,b,d1,d2,d,x,y;
a=y0-y1;
b=x1-x0;
d=2*a+b; //二倍避免了浮点数的运算
d1=2*a; //中点在上面的增量
d2=2*(a+b);//中点在下面的增量
x=x0;
y=y0;
dc.SetPixel(x,y,color);
while(x<x1)
{
if(d>0) //中点在上面 取下面的像素
d+=d1;
else //取上面的像素
{
d+=d2;
y++;
}
x++;
dc.SetPixel(x,y,color); //绘制像素
}
}