計算機圖形學學習(一) 直線中點算法講解及matlab實現


中點算法原理

  • 先講最簡單的一種情況,設直線斜率在區間 (0,1),其他情況可以類似推導。
  • 當前像素點爲P(xp,yp),下一像素點有兩種選擇P1或P2,P1,P2中點爲M(xp+1,yp+0.5),Q爲所畫直線與x=xp+1交點,如圖所示
    在這裏插入圖片描述
  • 當M在Q上方時,下一像素點取P1,M在Q下方時取P2

中點算法實現

  • 令需畫直線起點終點分別爲(x1,y1),(x2,y2),直線方程爲F(x,y)=ax+by+c=0,將點代入直線方程後化簡可得a/b=-k(斜率k),所以令a=y1-y2,b=x2-x1(只要滿足商爲-k即可),c=x1y2-x2y1

  • 可得點與直線的關係爲:

    • F(x,y)=0,在直線上
    • F(x,y)>0,在直線上方
    • F(x,y)<0,在直線下方
  • 將中點M(xp+1,yp+0.5)代入直線方程:d=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c,根據d值來確定下一像素點:

    • d<0,直線在M上方,取P2爲下一像素點
    • d>0,直線在M下方,取P1爲下一像素點
    • d=0,選P2,P1均可,我們這裏取P1
  • 若當前像素點爲P(xp,yp),我們考慮d>=0和d<0兩種情況:

    • d<0,此時P1爲下一像素點,下下一像素點爲:d1=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=[a(xp+1)+(yp+0.5)+c]+a+b=d+a+b

      此時d1=d+a+b,增量爲a+b

    • d>=0,此時P2爲下一像素點,下下一像素點爲:d2=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)+c=[a(xp+1)+(yp+0.5)+c]+a=d+a

      此時d2=d+a,增量爲a

  • d的值爲第一個像素點(x1,y1)所對應的d0,d0=F(x1+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=ax0+by0+c+a+0.5b=F(x0,y0)+a+0.5b,因爲F(x0,y0)=0,所以d0=a+0.5b

    考慮到d的增量均爲正數,用2d代替d擺脫對浮點數的計算,d1改爲2(a+b),d2改爲2a


matlab代碼實現

function midpoint(x1,y1,x2,y2,color)

a = (y1-y2);
b = (x2-x1);

d=2*a+b;
d1=2*a;
d2=2*(a+b);

x=x1;
y=y1;
hold on
grid minor
scatter(x,y,'.',color)
for i=x:x2
    if d<0
        x=x+1;
        y=y+1;
        d=d+d2;
    else
         x=x+1;
         d=d+d1;
    end
    scatter(x,y,'.',color)
end
hold off

查看結果

調用之前的midpoint函數(注意選斜率爲0到1之間的點)

midpoint(200,600,500,750,'red')

在這裏插入圖片描述

放大後觀察

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章