前言
在數(shù)學(xué)上,理想的直線是沒(méi)有寬度的,它是由無(wú)數(shù)個(gè)點(diǎn)構(gòu)成的集合。對(duì)直線進(jìn)行光柵化時(shí),只能在顯示器說(shuō)給定的有限個(gè)像素組成的矩陣中,確定最佳逼近于該直線的一組像素,并且按掃描線順序。
本節(jié)介紹繪制線寬為一個(gè)像素的直線的三個(gè)常用算法:數(shù)值微分,中點(diǎn)畫線和Bresenham算法。
數(shù)值微分法
已知過(guò)端點(diǎn) P0(x0, y0),P1(x1, y1) 的直線段 L(P0, P1);直線斜率為 k = (y1 - y0) / (x1 - x0)。
于是 yi+1 = kxi+1 + b。
于是,x每增加1,y就增加k。畫點(diǎn)的時(shí)候還需要判斷 int(y+0.5) 向下取整。
1 // 數(shù)值微分法,偽代碼 2 void DDAline(int x0, int y0, int x1, int y1) { 3 int dx, dy, x=x0, y=y0; 4 double k; 5 dx = x0 - x1;&