計算機圖形學學習1:直線DDA算法的實現

我們需要解決的問題:

給定直線兩端點A(Xa,Ya),B(Xb,Yb),然後畫出這個條直線。
首先介紹一個DDA算法(digital differential analyzer):
△x= xb - xa , △y=yb-ya。
設pi-1(xi-1,yi-1)點在AB直線上,若pi(xi,yi)點也在該直線上,則兩直角三角形相似,設比例係數爲ε,則小角形橫、縱軸長爲: εΔx, εΔy。
則pi點的座標爲:
在這裏插入圖片描述
(i=1,2,3,···,n)
在這裏插入圖片描述

下面確定ε的取值 :

根據公式寫出直線上第1,2,3,···n,點的座標,
特別是第n點的座標,有 :
在這裏插入圖片描述
爲使直線的第n點與直線的終點重合,令:
在這裏插入圖片描述
得n*ε=1, 則 ε=1/n,其中n爲繪點的個數

但是,合理選擇爲(考慮到分辨率):

n=max{|△x|,|△y|}
爲了逼近理想直線,可以對每點座標進行四捨五入處理,即:
在這裏插入圖片描述
其中[ ]符號表示取小於括號內的最小整數值。

以下使用matlab畫出使用DDA算法得到了直線:

function DDA_plot(x1,y1,x2,y2)
    length=abs(x2-x1);
    if abs(y2-y1)>length
        length=abs(y2-y1);
    end
    dx=(x2-x1)/length;
    dy=(y2-y1)/length;
    x=x1+0.5*sign(dx);
    y=y1+0.5*sign(dy);
    xlist=[];
    ylist=[];
    xlist(1)=x;
    ylist(1)=y;
    for i=2:length
        x=x+dx;
        y=y+dy;
        xlist(i)=x;
        ylist(i)=y;
    end
    plot(round(xlist),round(ylist));

得到結果如下:輸入(1,1,10,10),畫出(1,1)到(10,10)的直線
在這裏插入圖片描述

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