Bresenham直线算法
在射击类游戏开发中经常会遇到“物体(如子弹)直线飞行问题”,即:已知物体的起点与终点,如何计算出物体的直线运动路径,当然,这里的物体位置大多是整数。查了几篇帖子,原来这是计算机图形学中的一个经典算法--Bresenham直线算法。
几篇帖子收集总结一下,主要来源是 http://en.wikipedia.org/ 和 http://www.koders.com/
The Bresenham line algorithm is an algorithm which determines which points in an n-dimensional raster should be plotted in order to form a close approximation to a straight line between two given points. It is commonly used to draw lines on a computer screen, as it uses only integer addition, subtraction and bit shifting, all of which are very cheap operations in standard computer architectures. It is one of the earliest algorithms developed in the field of computer graphics. A minor extension to the original algorithm also deals with drawing circles.
Bresenham直线演算法是用来描绘由两点所决定的直线的算法,它会计算出一条线段在 n 维光栅上最接近的点。这个演算法不适用浮点数计算,而只用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的经典算法。经过少量的延伸之后,原本用来画直线的演算法也可用来画圆。
算法概述

如图为Bresenham直线演算法描绘的直线,下面简述之。
假设我们需要由 (x0, y0) 这一点,绘画一直线至右下角的另一点(x1, y1),x,y分别代表其水平及垂直座标,并且 x1 - x0 > y1 - y0。在此我们使用电脑系统常用的座标系,即x座标值沿x轴向右增长,y座标值沿y轴向下增长。
因此x及y之值分别向右及向下增加,而两点之水平距离为x1 ? x0且垂直距离为y1-y0。由此得之,该线的斜率必定介乎于1至0之间。而此算法之目的,就是找出在x0与x1之间,第x行相对应的第y列,从而得出一像素点,使得该像素点的位置最接近原本的线。
对于由(x0, y0)及(x1, y1)两点所组成之直线,公式如下:
![]()
因此,对于每一点的x,其y的值是

Bresenham直线算法是一种在计算机图形学中用于绘制直线的经典算法,它避免了浮点运算,仅使用整数加法、减法和位移操作。本文介绍了算法的基本思想、一般化、优化和实现代码,适用于不同方向和斜率的直线绘制。通过误差累积和判断,确定每个像素点的位置,以接近实际直线。此外,还提供了Java实现的代码示例。
最低0.47元/天 解锁文章
999

被折叠的 条评论
为什么被折叠?



