Bresenham圆转换算法详解

目录

1、圆的性质

2、算法思想

3、C语言伪代码

4、例题


1、圆的性质

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

蓝色弧即为所求

2、算法思想

        “暴力”做法是,从 x=0,y=r 开始,x每次移动一个像素,并计算 y=\sqrt{r^{2}-x^{2}} 直到 x=y 为止。此做法的缺点很明显,计算平方和开方,非常费时,而且开方会导致精度不够。此时,Bresenham转换算法就派上用场了。

我们以一幅参考图为例:

目前我们的像素点位于(xi, yi)(图中蓝色方块),接下来我们将往下走一步,即决定涂T点(粉红)还是S点(绿色)方块。

可以简单计算出T点和S点距离圆边的距离

 这两个式子起到了一个重要作用:为从一个像素到真实的圆的边缘距离提供相对度量,也就是误差值。

接下来开始计算了:

由于D(T)>0,D(S)<0;于是定义:di=D(T)+D(S)

展开可得

 联立两个式子可得式子①(由参考图可知,x_{i+1}=x_{i}+1,所以可以联立):

 接下来是分类讨论:

  • 如果选中的是像素点T,则 d_{i}<0y_{i + 1} = y_{i}

带入式子①可得:d_{i+1}=d_{i} + 4x_{i}+6

  • 如果选中的是像素点S,则 d_{i}>0,y_{i+1}=y_{i}-1

带入式子①可得:d_{i+1}=d_{i}+4(x_{i}-y_{i})+10

整合一下就是:

 至此,一些必要的公式已经推导完成。

综上所述,Bresenham画圆算法的步骤如下:

  1.  初始化 x=0,y=r,d1=3-2r (将初始像素(0, r)带入求误差公式即可得)。
  2.  xi < yi 时,执行以下操作:

     ① 画像素点(xi,  yi)

    ② 求下一个像素点:

    ③ 求下一步的误差: 

  3. 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 变化如下,读者可以自行计算:

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值