有了上面的代码垫底,我想很多人都可以放心了,因为大不了跑一个高速晶振也能快速的画出直线,否则你还需要耐心的阅读下面的算法。
首先,我们给出这个算法的伪代码。
在(x1,y1)到(x2,y2)之间画一条直线
dx 是x到终点横坐标的距离
dy 是y到终点纵坐标的距离
ix 是dx的绝对值
iy 是dy的绝对值
inc是dx和dy中较大的那个
plot是是否要画一个点的标志位,boolean变量
plotx 是当前点所在的横坐标
ploty 是当前点所在的纵坐标
plotx = x1
ploty = y1
x = 0
y = 0
在 plotx,ploty画一个点——起点
for i = 0 to inc 增量1
x += ix
y += iy
plot = false
if x > inc then
plot = true
x -= inc
if dx > 0 then plotx ++
if dx < 0 then plotx --
if y > inc then
plot = true
y -= inc
if dy > 0 then ploty ++
if dy < 0 then ploty --
if plot == true then 在(plotx,ploty)处画点
这就是计算机图形学中流行的布兰森汉姆(Bresenham)算法,他的意图就是采用离散的整数增量来代替斜率增量计算,学习这个算法,最好的方法不是看多少理论,而是按照上面的伪代码自己完成一条直线的绘制工作,你就能心领神会了——不是小弟我偷懒。
所有的计算都是简单得整数计算,代码效率自然不用小弟我罗嗦哈。 |