光柵圖形學之直線段掃描算法(中點畫線法)

說明:本文章系作者學習資料整理,不完善的地方請大家指正,謝謝!

摘自《計算機圖形學基礎教程》清華大學出版社 孫家廣 胡事民

 

 

我們知道利用任何畫圖工具,知道兩個點之後,便可以在窗口畫出一條直線,其計算機內部原理,便是利用了光柵化。計算機屏幕可以看作是有幾行幾列的單位正方形組成,在數學中線是沒有寬度的。當線與正方形的邊有交點時,我們需要判定選取正方形的哪個頂點作爲線上的一個點。這便引出了圖形掃描轉換的算法。

 

中點畫線法

我們知道直線y=k*x+b  可以寫成y-k*x-b=0的形式;進而寫成函數F(x,y)=y-k*x-b;注意在此我們要使得y的係數一定爲正,這和我們以下討論的直線和點的位置關係息息相關。只有y的係數是正的時候,以下關係式才成立;如果y的係數是負的話,下面的關係式是相反的;

當點在直線上方時,點的座標帶入函數,F(x,y)>0;

當點在直線下方時,點的座標帶入函數,F(x,y)<0;

當點在直線上時,點的座標帶入函數,F(x,y)=0;

已知點P1(x0,y0),P(x1,y1)並且都是整數座標對。令dx=x1-x0; dy=y1-y0 ; 並且x1>x0恆成立,那麼dx恆大於0; 且k=dy/dx;方程y-k*x-b=0改寫成y-(dy/dx)*x-b=0;

最終函數F(x,y)=y*dx-x*dy-B;其中B=b*dx;

我們討論

(1)0<k<=1的情況

沿着x軸的方向,x的值每次加一個單位,我們需要判斷的就是縱座標是加1還是保持原值。我們判斷的依據是,當中點(直線與小正方形邊點的交點所在邊的中點)與直線的關係,通過上面討論的關係式進行判斷。

我們知道點(x0,y0)在直線上,帶入函數,函數值等於0;我們將中點(x0+1,y0+0.5)帶入函數F(x,y)中,

F(x0+1,y0+0.5)=(y0+0.5)*dx-(x0+1)*dy-B=F(x0,y0)+0.5*dx-dy;其中F(x0,y0)=0;

由於浮點數的出現會導致運算量的增大,我們令d=2*F(x,y),所以d0=dx-2*dy;

當d0>0時,中點在直線的上方,我們選取中點下方的整數座標對,即點(x0+1,y0),也就是x++,而y的值不變。我們繼續判斷下一個中點(x0+2,y0+0.5),帶入函數,d=2*F(x0+2,y0+0.5)=d0+(-2*dy);

其中d1=-2*dy看作是增量;

當d0<=0時,中點在直線的下方,我們選取中點上方的整數座標對,即點(x0+1,y0+1);也就是x++,y++。我們繼續判斷下一個中點(x0+2,y0+1.5),帶入函數,d=2*F(x0+2,y0+0.5)=d0+2*(dx-dy)

其中d2=2*(dx-dy)看作是增量;

(2)0>k>=-1的情況

 

 此時,情況有所不同,當沿着x軸,橫座標加單位1時,縱座標在遞減;所以d0=-dx-2*dy;

當d0>0時,中點在直線上方,取中點下方的點,即x++,y- -; d1=-2*(dx+dy);

當d0<=0時,中點在直線下方,取中點上方的點,即x++,縱座標的值保持不變; d2=-2*dy;

(3)k>1的情況

此時,我們需要沿着y軸的方向,縱座標加單位1,而橫座標在遞增;我們需要判斷的就是橫座標是加1還是保持原值。我們判斷的依據是,當中點(直線與小正方形邊點的交點所在邊的中點)與直線的關係,通過上面討論的關係式進行判斷。

 

 

 

 

 

 

我們知道點(x0,y0)在直線上,帶入函數,函數值等於0;我們將中點(x0+0.5,y0+1)帶入函數F(x,y)中,

F(x0+0.5,y0+1)=(y0+1)*dx-(x0+0.5)*dy-B=F(x0,y0)+dx-0.5*dy;其中F(x0,y0)=0;

由於浮點數的出現會導致運算量的增大,我們令d=2*F(x,y),所以d0=2*dx-dy;

當d0>0時,中點在直線的上方,我們選取中點右方的整數座標對,即點(x0+1,y0+1),也就是x++,y++。我們繼續判斷下一個中點(x0+1.5,y0+2),帶入函數,d=2*F(x0+1.5,y0+2)=d0+2*(dx-dy);   其中d1=2*(dx-dy)看作是增量;

當d0<=0時,中點在直線的下方,我們選取中點左方的整數座標對,即點(x0,y0+1),也就是y++,橫座標保持不變。我們繼續判斷下一個中點(x0+0.5,y0+2),帶入函數,d=2*F(x0+0.5,y0+2)=d0+2*dx;

 

其中d2=2*dx看作是增量;

(4)k<-1的情況

此時,當沿着y軸,縱座標減去單位1,而橫座標遞增。所以d0=-2*dx-dy;

當d0>0時,中點在直線上方,取中點左方的點,即y- -,而橫座標的值保持不變;增量d1=-2*dx;

當d0<=0時,中點在直線下方,取中點右方的點,即y- -,x++;增量d2= -2*(dx+dy);

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章