dda演算法畫直線 再談繪製直線

2021-10-13 18:09:05 字數 2077 閱讀 5680

之前已經在[從零開始計算機圖形學]之七畫線 寫過繪製直線了,現在再來仔細的看一下這個問題。

tinyrenderer​github.com

void line(int x0, int y0, int x1, int y1, tgaimage &image, tgacolor color)  

}

這裡的問題有兩個:

t取大了畫出來的並不是線,而是一堆點。t取小了會浪費,有很多重複的x和y。

void line(int x0, int y0, int x1, int y1, tgaimage &image, tgacolor color)  

}

我們想著要節約,就每次 x 增加1,然後來畫y。

這樣畫線是對的因為我們假設

所以同時它的問題是我們也已經指出:

所以想法是:

看**:

void line(int x0, int y0, int x1, int y1, tgaimage &image, tgacolor color)  

for (int x=x0; x<=x1; x++) else } }

這樣就可以完善上述出現的問題來畫線了。

其實上述**加上 compiler 本身的優化已經可以很快了 (g++ -o3),但是因為歷史原因我們繼續來看它的優化畫法,首先是上述演算法中

我們現在一定有

, 畢竟如果

都已經被我們交換了。

我們令那麼這個derror就是x每增加1,y的變化量的絕對值,我們知道derror一定小於1大於0.

我們令error來表示y應該有的偏移量, 每當error > 0.5,我們就把y增加(或者減少)1,同時把error減少1.

看**:

void line(int x0, int y0, int x1, int y1, tgaimage &image, tgacolor color)  

int dx = x1-x0;

int dy = y1-y0;

float derror = std::abs(dy/float(dx));

float error = 0;

int y = y0;

for (int x=x0; x<=x1; x++) else

error += derror;

if (error>.5) } }

理解的話,當偏移量大於0.5時候,我們根據線是朝上或者朝下來畫點,同時把error - 1.重置這個偏移量。

或者看下方:

因為每次變化之後y都增加或者減少了1,所以error這個偏移量需要重置。

我們用另乙個數來替換這個 derror,叫它 error2. 令它等於 derror * dx * 2.然後在相應的error和比較地方做修正:

void line(int x0, int y0, int x1, int y1, tgaimage &image, tgacolor color)  

int dx = x1-x0;

int dy = y1-y0;

int derror2 = std::abs(dy)*2;

int error2 = 0;

int y = y0;

for (int x=x0; x<=x1; x++) else

error2 += derror2;

if (error2 > dx) } }

優化完成,done!

這就是大名鼎鼎的bresenham's line algorithm.

不過正如之前說的,其實版本3已經被compiler優化的很不錯了。

python-pillow/pillow畫線也是用的這個演算法。

DDA演算法畫直線

畫直線的 適合所有斜率的直線 void cmyview linedda cdc pdc,int x0,int y0,int x1,int y1,colorref clr while y ymax return if y0 y1 水平線 while x xmax return double dx x1...

畫直線演算法

畫直線演算法 前段時間做了一下光柵直線生成演算法的研究,並且在vc下實現了dda 演算法 bresenham 演算法 對稱演算法 兩步演算法 及四步演算法。這裡給個總結,希望和大家交流。主要研究的演算法主要有 dda演算法 bresenham 演算法 對稱演算法 兩步演算法 及四步演算法,此外還對自...

直線繪製演算法

點在計算機中是組成圖形的最基本元素,我們幾何基本圖形的繪製是乙個個畫素點按照一定規則排列而成的組成的。而複雜的圖形是有基本幾何圖形組成的。所以基本圖形的繪製演算法,是學習計算機圖形學的基礎和關鍵。基本圖形包括 直線,矩形,三角形 直線是圖形中最常見的,在解析幾何中,二維座標系中的直線的表示式是 y ...