1. 程式人生 > >光柵圖形學-中點畫線法

光柵圖形學-中點畫線法

在數學上,理想的直線是沒有寬度的,它是由無數個點構成的集合。對直線進行光柵化時,只能在顯示器所給定的有限個畫素組成的矩陣中,確定最佳逼近該直線的一組畫素,並且按掃描線排序。

中點畫線法:通過觀察發現,畫直線段的過程中,當前畫素點為(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); //繪製畫素
	}
}