Bresenham 演算法是中點畫線的等價變體,同樣僅需整數加減運算,但邏輯更直觀:維護誤差項 e,累加斜率分子,超過分母則修正 y 軸。
0 ≤ 斜率 ≤ 1(即 dx ≥ dy ≥ 0),x 每遞增 1,y 決定是否遞增 1。e 初始化為 -dx(對應連續域的 -0.5 × 2dx)。e += 2×dy;若 e ≥ 0 則 y++ 並 e -= 2×dx。public void BresenHam_Line(Graphics g, int x0, int y0, int x1, int y1, int color) {
int dx = x1 - x0;
int dy = y1 - y0;
int e = -dx; // 誤差項初值
int x = x0, y = y0;
for (int i = 0; i <= dx; i++) {
g.setColor(color);
g.drawLine(x, y, x, y); // 畫單一像素
x++;
e += 2 * dy;
if (e >= 0) {
y++;
e -= 2 * dx;
}
}
}
兩者數學本質相同,Bresenham 以「誤差項累加斜率分子」視角,中點畫線以「中點判別式符號」視角。Bresenham 程式碼更精簡,中點畫線推導過程更利於理解幾何意義。
實際專案中需封裝為通用 drawLine(x0,y0,x1,y1):
dx = |x1-x0|, dy = |y1-y0|。此演算法為光柵顯示系統的基石,J2ME 遊戲引擎、向量字型渲染皆大量依賴其變體。