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

Bresenham算法介紹

Bresenham是計算機圖形學領域使用最廣泛的直線掃描轉換算法,其核心思想是由誤差項符號決定下一個像素點取右邊的一個點還是右上的一個點

Bresenham算法實現

  • 這裏只講最簡單的一種情況:直線位於第一象限

  • 設直線起點終點分別爲(x0,y0)、(x1,y1),直線方程爲y=kx+b,k=(y1-y0)/(x1-x0)

  • 設當前像素點爲(xi,yi),當x每次增加一個像素點時下一個像素點座標爲(xi+1,yi)或(xi+1,yi+1)

  • 下一個點座標由直線在xi+1處與yi、yi+1的距離d1、d2決定,d1=y-yi=kx+b-kxi=k(xi+1)+b-yi
    d2=(yi+1)-y=yi+1-[(k(xi+1)+b)]
    在這裏插入圖片描述
    如果d1-d2>0,則下一個像素點座標爲(xi+1,yi+1),否則爲(xi+1,yi)

  • 令Pi=(d1-d2)Δx,將k=Δy/Δx帶入Pi
    Pi=2xiΔy-2yiΔx+2Δy+(2b-1)Δx
    d1-d2是用於判斷符號的誤差項,因爲在第一象限,所以Δx恆大於0,Pi仍可用於判斷符號的誤差,且計算僅包含整數運算,更利於計算機運算

  • ∵Pi=2xiΔy-2yiΔx+2Δy+(2b-1)Δx
    且Pi+1=2(xi+1)Δy-2(yi+1)Δx+2Δy+(2b-1)Δx
    ∴ Pi+1=Pi+2Δy-2(yi+1-yi)Δx
    若取右上方像素點,則yi+1-yi=1,則Pi+1=Pi+2Δy-2Δx
    若取右邊像素點,則yi+1-yi=0,則Pi+1=Pi+2Δy

  • 求誤差的初值P0: ∵y=kx+b,∴b=yi-kxi,將b,k=Δy/Δx,i=0代入Pi=2xiΔy-2yiΔx+2Δy+(2b-1)Δx
    解出結果爲P0=2Δy-Δx

matlab代碼實現

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

deltax=abs(x2-x1);
deltay=abs(y2-y1);

if(x2-x1>=0)
    s1=1;
else
    s1=-1;
end

if(y2-y1>=0)
    s2=1;
else
    s2=-1;
end

if(deltay>deltax)
    change=deltax;
    deltax=deltay;
    deltay=change;
    t=1;
else
    t=0;
end
f=2*deltay-deltax;
x=x1;
y=y1;
hold on
grid minor
scatter(x,y,'.',color)
for i=1:deltax
    if(f>=0)
        if(t==1)
            x=x+s1;
        else
            y=y+s2;
        end
        scatter(x,y,'.',color)
        f=f-2*deltax;
    else
         if(t==1)
            y=y+s2;
        else
            x=x+s1;
         end
         f=f+2*deltay;
    end
end
hold off

成果演示

在這裏插入圖片描述

放大後觀察爲一個一個的點

在這裏插入圖片描述

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