Bresenham画线算法一个很经典的算法,但是搜遍了互联网,几乎没有可用并满意的代码。以下内容部分来自于《32位单片机C语言编程 基于PIC32》,有所改动,代码实现已经非常的精简了。原代码为C语言实现,但是为了测试我改成javascript,这样就可以很容易的在浏览器里查看结果。本代码经过简单修改,就可以还原为C语言版本。
1962年,工作在IBM公司圣何塞开发实验室的Jack E. Bresenham发明了一个大量使用整数算数运算的画线算法。直到今天这个算法仍然被认为是所有计算机图形程序的基础。该方法基于3个优化“小技巧”:
(1). 将绘画方向简化成一个个别情况(从左到右)。
(2). 将直线的斜率简化成一个个别情况,即水平距离最大。
(3). 将等式两端的表达式都乘以水平距离(deltax)来获得整数值。
这样得到的画线代码非常紧凑而高效;以下是实现这个算法的javascript代码:
function drawline(x0, y0, x1, y1){
//以下这些变量全部为整数类型。
var steep, t;
var deltax, deltay, error;
var x, y;
var ystep;
steep = (Math.abs(y1-y0) > Math.abs(x1-x0));
if(steep){
t = x0; x0 = y0; y0 = t;
t = x1; x1 = y1; y1 = t;
}
if (x0 > x1){
t = x0; x0 = x1; x1 = t;
t = y0; y0 = y1; y1 = t;
}
deltax = x1 - x0;
deltay = Math.abs(y1-y0);
error = 0;
y = y0;
if(y0<y1) else="" ystep="1;">
for (x=x0; x < x1; x++){
if (steep) drawdot(y, x); else drawdot(x, y);
error += deltay;
if ((error << 1) >= deltax){
y += ystep;
error -= deltax;
}
}
}