光栅图形学-中点画线法

版权声明:转载请注明出处。 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); //绘制像素
	}
} 

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82915582