目录
1、圆的性质
在讲解之前,先来了解一下圆的某些性质,bresenham圆转化法对这些性质有一定的应用。让我们来看下图,首先,考虑以坐标系原点为圆心,半径为 r 的圆,则圆周上各点满足 x² + y² = r²。因为圆满足八对称性,所以只要扫描转换八分之一圆弧,就可以求出整个圆弧的像素集。又由于圆关于坐标轴、和对角线对称,在对圆进行扫描转换时,我们只需计算 0度到45度 之间的一段圆弧就能得到整个圆,而且取该角度区间也是为了便于计算。

2、算法思想
“暴力”做法是,从 x=0,y=r 开始,x每次移动一个像素,并计算 直到 x=y 为止。此做法的缺点很明显,计算平方和开方,非常费时,而且开方会导致精度不够。此时,Bresenham转换算法就派上用场了。
我们以一幅参考图为例:
目前我们的像素点位于(xi, yi)(图中蓝色方块),接下来我们将往下走一步,即决定涂T点(粉红)还是S点(绿色)方块。
可以简单计算出T点和S点距离圆边的距离
这两个式子起到了一个重要作用:为从一个像素到真实的圆的边缘距离提供相对度量,也就是误差值。
接下来开始计算了:
由于D(T)>0,D(S)<0;于是定义:di=D(T)+D(S),
展开可得
又
联立两个式子可得式子①(由参考图可知,,所以可以联立):
接下来是分类讨论:
- 如果选中的是像素点T,则
,
,
带入式子①可得:,
- 如果选中的是像素点S,则
带入式子①可得:,
整合一下就是:
至此,一些必要的公式已经推导完成。
综上所述,Bresenham画圆算法的步骤如下:
- 初始化 x=0,y=r,d1=3-2r (将初始像素(0, r)带入求误差公式即可得)。
- 当 xi < yi 时,执行以下操作:
① 画像素点(xi, yi)
② 求下一个像素点:
③ 求下一步的误差:
- 若 xi >= yi,画像素点 (x, y);否则重复第二步
通过以上步骤,就可以画出圆了。
3、C语言伪代码
void BRESCircle (int r, int Color )
{
int x = 0, y = r, d = 3 - 2*r;
while (x < =y) {
CirclePoints(x, y, Color);
if (d >= 0) {
d += 4*(x-y) + 10;
y--;
}
d += 6+4*x;
x ++;
}
}
4、例题
用 Bresenham 算法画圆心为 O(0, 0) ,半径为 R = 10 的八分之一圆弧:
画圆的过程中x、y、d 变化如下,读者可以自行计算: