Bresenham快速画直线算法(中文翻译+注释)

本文介绍了Bresenham快速画直线算法的原理,详细解释了如何在光栅网格上绘制斜率为0≤m≤1的直线。通过对误差变量的控制,实现从数学线段到实际绘制线段的最小误差。文章提供了算法的C++实现,强调了其全整数计算的高效性,并指出该版本仅适用于第一象限的直线,但可以扩展到任意斜率的线段。
摘要由CSDN通过智能技术生成

原文:https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html

基本Bresenham算法

考虑在光栅网格上绘制一条直线,这条直线的斜率是 0 ≤ m ≤ 1 0\leq m \leq 1 0m1

斜率定义:假设直线起点是(x1, y1),终点是(x2, y2),则斜率=(y2-y1)/(x2-x1)。

如果我们进一步限制该绘制程序,使其在绘制时 x 值不断递增,那么很明显,在 (x, y) 处绘制一个点后,直线下一个点的位置范围非常有限:

  • 可以是 (x+1, y),
  • 或者是 (x+1, y+1)。

所以,在平面的第一个八分之一区域画线,变成了每一步进行一次二选一的问题。
我们可以画出绘图程序在绘制 (x, y) 时发生的情况。

在绘制 (x, y) 时,通常情况下,直线上实际的数学点和像素网格不是一一对应的,绘制的点会有误差,绘制程序需要在绘制位置和屏幕实际分辨率之间做出折中。所以我们把每个 y 坐标和一个误差值 ϵ \epsilon ϵ 联系起来,y的实际值应该是 y + ϵ y + \epsilon y+ϵ。此误差值范围为 -0.5 到 +0.5。

从 x 移动到 x+1 时,让 y 坐标的值增加一个等于直线斜率 m 的量,如果这个新值与 y 之间的差小于 0.5,我们将绘制 (x+1, y),否则绘制 (x+1, y+1)。很明显,通过这样做,可以将数学线段和实际绘制线段之间的总误差降到最小。

把这个新点产生的误差写回到 ϵ \epsilon ϵ,就可以在 x+2 处对下一个点重复整个过程。

新的误差值可以采用两个可能值中的一个,具体取决于绘制的新点。如果选择(x+1,y),新的误差值是:
ϵ n e w \epsilon_{new} ϵnew <— ( y + ϵ + m ) − y (y+\epsilon+m)-y (y+ϵ+m)y
否则是:
ϵ n e w \epsilon_{new} ϵnew <— ( y + ϵ + m ) − ( y + 1 ) (y+\epsilon+m)-(y+1) (y+ϵ+m)(y+1)

这种方法通过误差变量 ϵ \epsilon ϵ 来控制绘图,使DDA算法避免了舍入操作。

DDA的全称是Digital Differential Analyzer,即数值微分算法,是一种最简单的画直线算法。

ϵ \epsilon ϵ <— 0,y <— y 1 y_1 y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值