關於對Bresenham畫線演算法的理解

2021-04-15 10:18:38 字數 2098 閱讀 3958

最近一段時間想理解一下bresenham演算法,總結出以下心得.

假設線性方程:

ax + by + c = 0 (x

1 < = x  <= x

2, y

1 <= y <= y

2)dx = x

2 - x

1dy = y

2 - y

1當x = x

1 + 1:

ax1 + by

1 + c = 0;            (1-1)

a(x1 + 1) + by + c = 0;     (1-2)

從1-1和1-2可以得出, y = (  -c - a(x1+1) ) / b;

而中點位置為 y

m = y

1 + 0.5.

而if (y - y

m >= 0) y = y

1 + 1;

else y = y

1;所以 sub = y - y

m = (  -c - a(x1+1) ) / b - y

1 - 0.5

= -a/b-0.5

剛好 -a / b =  dy / dx, 所以 sub = y - y

m = dy / dx - 0.5;

好,我們現在得到了第乙個鄰節點,讓我們來計算第二個鄰節點:

1.如果第二個鄰節點是第乙個鄰節點的右上鄰接點,則

sub2 = (-c-a(x1+2))/b - (y1+1.5) = -2a/b - 1.5

故sub差值dsub = sub2 - sub1 = -2a/b - 1.5 - (-a/b-0.5) = -a/b - 1.代入a/b得dsub = dy/dx -1;

2.如果第二個鄰節點是第乙個鄰節點的右鄰接點,

sub2 = (-c-a(x1+2))/b - (y1+0.5) = -2a/b - 0.5

故sub差值dsub = sub2 - sub1 = -2a/b - 0.5 - (-a/b-0.5) = -a/b. 代入a/b得dsub = dy/dx;

好,現在我們來實現bresenham演算法的**:

//bresenham

x=x1;

y=y1;

dx = x2-x1;

dy = y2-y1;

sub = dy/dx-0.5; // 賦初值,下個要畫的點與中點的差值

drawpixel(x, y); // 畫起點

while(x 0) // 下個要畫的點為當前點的右上鄰接點

else// 下個要畫的點為當前點的右鄰接點

// 畫下個點

drawpixel(x,y);

}這時候發現sub起的作用純粹為正負判斷,由於除法運算比較費時,所以我們來優化一把

sub = dy / dx - 0.5;   (2 - 1)

dsub = dy/dx -1;       (2 - 2 -1)

dsub = dy/dx ;           (2 - 2 -2)

所以全部乘以2 * dx, 為2*dy - dx, 2*dy - 2*dx, 2*dy,**我們可以這樣寫:

//bresenham

x=x1;

y=y1;

dx = x2-x1;

dy = y2-y1;

sub = 2 * dy - dx; // 賦初值,下個要畫的點與中點的差值

drawpixel(x, y); // 畫起點

while(x 0) // 下個要畫的點為當前點的右上鄰接點

else// 下個要畫的點為當前點的右鄰接點

// 畫下個點

drawpixel(x,y);

}現在發現還是不是很優化,來更近一步:

int x, y, dx, dy;

int k, sub;

dx = x1-x0;

dy = y1- y0;

sub=-dx;

x=x0;

y=y0;

for (i=0; idrawpixel (x, y, color);

x++;

sub = sub + 2*dy;

if (sub>=0)

這樣就優化的差不多了

Bresenham畫線演算法

bresenham畫線演算法 bresenham演算法是計算機圖形學領域使用最廣泛的直線掃瞄轉換演算法。仍然假定直線斜率在0 1 之間,該方法類似於中點法,由乙個誤差項符號決定下乙個象素點。演算法原理如下 過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然...

Bresenham 畫線演算法

bresenham 畫線演算法是由 bresenham 提出的一種精確而有效的光柵線生成演算法,該演算法僅僅使用了 整數的增量來實現的。bresenham 演算法將對整形引數的符號檢測,整形引數的值比於實際險段之間的偏量。bresenham 演算法內容 對於直線方程 y kx b a 0 斜率 1 ...

Bresenham 畫線演算法

bresenham 畫線演算法是由bresenham提出的一種精確而有效的光柵線生成演算法,該演算法僅僅使用了 整數的增量來實現的。bresenham演算法將對整形引數的符號檢測,整形引數的值比於實際險段之間的偏量。bresenham演算法內容 對於直線方程 y kx b a,0 斜率 1 時候的演...