@iStarLee
2019-08-12T12:22:44.000000Z
字数 2270
阅读 1705
navigation
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。
简单来说,如下图所示,真实的直线是连续的,但我们的计算机显示的精度有限,不可能真正显示连续的直线,于是我们用一系列离散化后的点(像素)来近似表现这条直线。

考虑最简单的情况,

算法流程如下

核心理解点是

考虑第二种情况,
算法流程如下
核心理解点是

事实上要根据起始点终点画一条直线(按照带箭头的理解)一共有八种情况

我们通过一个简单的处理将八种情况都统一到上面的两种情况来处理,思路是:
function draw_line(x0,x1,y0,y1)steep = abs(y1-y0)>abs(x1-x0) //判断是否是大斜率情况if steep then //处理大斜率情况,交换x,y坐标swap(x0,y0)swap(x1,y1)if x0>x1 then //处理x递减的情况,交换起点和终点swap(x0,x1)swap(y0,y1)int deltx = x1-x0 //+int delty = abs(y1-y0) //+double error = 0 //误差+double delterr = deltay/deltx //斜率+int y = y0 //画线y坐标int ystep //应对 1.2 中介绍的两种情况if y0<y1 thenystep = 1elseystep = -1for x from x0 to x1 //画线x坐标if steep thenplot(y,x)//大斜率elseplot(x,y)error = error + delterrif error >=0.5 then //这个地方将上面的两种情况又统一成了一种情况,niubility啊!y = y + ysteperror = error -1
接下来解释一下为什么可以将上面的两种情况统一
第二种情况的判断条件是,,其中 ,
写成

function line(x0, x1, y0, y1)boolean steep := abs(y1 - y0) > abs(x1 - x0)if steep thenswap(x0, y0)swap(x1, y1)if x0 > x1 thenswap(x0, x1)swap(y0, y1)int deltax := x1 - x0int deltay := abs(y1 - y0)int error := deltax / 2int ystepint y := y0if y0 < y1 then ystep := 1 else ystep := -1for x from x0 to x1if steep then plot(y,x) else plot(x,y)error := error - deltayif error < 0 theny := y + ysteperror := error + deltax
理解这个算法转换的核心是将判断条件,写成
在珊格地图中,已知起止点(当前激光束测量数据)就可以使用bresenham算法得到两点之间的通过点,进而利用概率知识更新对应格子的概率值,得到珊格地图。