基本上bresenham畫線演算法的思路如下:
// 假設該線段位於第一象限內且斜率大於0小於1,設起點為(x1,y1),終點為(x2,y2).
// 根據對稱性,可推導至全象限內的線段.
1.畫起點(x1,y1).
2.準備畫下個點。x座標增1,判斷如果達到終點,則完成。否則,由圖中可知,下個要畫的點要麼為當前點的右鄰接點,要麼是當前點的右上鄰接點.
2.1.如果線段ax+by+c=0與x=x1+1的交點的y座標大於m點的y座標的話,下個點為u(x1+1,y1+1)
2.2.否則,下個點為b(x1+1,y1)
3.畫點(u或者b).
4.跳回第2步.
5.結束.
這裡需要細化的是怎麼判斷下個要畫的點為當前點的右鄰接點還是當前點的右上鄰接點.
設線段方程:ax+by+c=0(x1從第乙個點開始,我們有f(x,1,y1) = a*x1+b*y1+c=0
下面求線段ax+by+c=0與x=x1+1的交點:
由a*(x1+1)+b*y+c = 0, 求出交點座標y=(-c-a(x1+1))/b
所以交點與m的y座標差值sub1 = (-c-a(x1+1))/b - (y1+0.5) = -a/b-0.5,即sub1的處始值為-a/b-0.5。
則可得條件當 sub1 = -a/b-0.5>0時候,即下個點為u.
反之,下個點為b.
代入a/b,則sub1 = dy/dx-0.5.
因為是個迴圈中都要判斷sub,所以得求出迴圈下的sub表示式,我們可以求出sub的差值的表示式.下面求x=x1+2時的sub,即sub2
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;
於是,我們有了sub的處始值sub1 = -a/b-0.5 = dy/dx-0.5,又有了sub的差值的表示式dsub = dy/dx -1 (當sub1 > 0)或 dy/dx(當sub1 < 0).細化工作完成。
於是pcode可以細化如下:
// pcode for bresenham line
// by soroman
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);
}ps:一般優化:
為避免小數轉整數以及除法運算,由於sub只是用來進行正負判斷,所以可以令sub = 2*dx*sub = 2dy-dx,則
相應的dsub = 2dy - 2dx或2dy.
思考1:如果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 時候的演...