中点画圆法详解

中点画圆法

一、算法原理

利用圆的对称性,只须讨论1/8圆,即下图第二个8分圆区域:
在这里插入图片描述

  1. 假设 P ( x , y ) P(x,y) P(x,y)为当前像素,下一个像素可能是正右方 P 1 ( x + 1 , y ) P_1(x+1,y) P1(x+1,y)或右下方 P 2 ( x + 1 , y − 1 ) P_2(x+1,y-1) P2(x+1,y1),如上图所示。
  2. M M M P 1 P_1 P1 P 2 P_2 P2间的中点,即 M M M的坐标为 ( x + 1 , y − 0.5 ) (x+1,y-0.5) (x+1,y0.5)。若 M M M在圆内,则 P 1 P_1 P1靠近圆弧,应该取为下一像素,否则应取 P 2 P_2 P2

二、公式推导

  1. 构 造 函 数 : 构造函数: F(x,y)=x^2 + y ^2 - R^2$ ,则有:
    F ( x , y ) = 0 ( x , y ) 在 圆 上 F ( x , y ) < 0 ( x , y ) 在 圆 内 F ( x , y ) > 0 ( x , y ) 在 圆 外 F(x,y)= 0 (x,y)在圆上\\ F(x,y)< 0 (x,y)在圆内\\ F(x,y)> 0 (x,y)在圆外 Fx,y=0x,yFx,y<0x,yFx,y>0x,y
  2. 带入 M M M坐标,有如下结论:
    F ( M ) < 0 F(M)< 0 FM<0 M在圆内,取 P 1 P_1 P1
    F ( M ) ≥ 0 F(M)\geq 0 FM0 M在圆外,取 P 2 P_2 P2
    为此,可采用如下判别式:
    d = F ( M ) = F ( x + 1 , y − 0.5 ) = ( x + 1 ) 2 + ( y − 0.5 ) 2 − R 2 \begin{aligned} d &= F(M) \\ &= F(x + 1, y - 0.5)\\ &= (x + 1)^2 + (y - 0.5) ^2 - R^2 \end{aligned} d=F(M)=F(x+1,y0.5)=(x+1)2+(y0.5)2R2
  3. d < 0 d<0 d<0,则 P 1 P_1 P1 为下一个像素,那么再下一个像素的判别式为:
    d 1 = F ( x + 2 , y − 0.5 ) = ( x + 2 ) 2 + ( y − 0.5 ) 2 − R 2 = d + 2 x + 3 \begin{aligned} d_1 &= F(x + 2, y - 0.5)\\ &= (x + 2)^2 + (y - 0.5) ^2 - R^2\\ &= d + 2x +3 \end{aligned} d1=F(x+2,y0.5)=(x+2)2+(y0.5)2R2=d+2x+3
    即, d d d的增量为 2 x + 3 2x +3 2x+3
  4. d ≥ 0 d \geq 0 d0,则 P 2 P_2 P2 为下一个像素,那么再下一个像素的判别式为:
    d 2 = F ( x + 2 , y − 1.5 ) = ( x + 2 ) 2 + ( y − 1.5 ) 2 − R 2 = d + ( 2 x + 3 ) + ( − 2 y + 2 ) = d + 2 ( x − y ) + 5 \begin{aligned} d_2 &= F(x + 2, y - 1.5)\\ &= (x + 2)^2 + (y - 1.5) ^2 - R^2\\ &= d + (2x +3) +(-2y+2)\\ &=d+2(x-y)+5 \end{aligned} d2=F(x+2,y1.5)=(x+2)2+(y1.5)2R2=d+(2x+3)+(2y+2)=d+2(xy)+5
    即, d d d的增量为 2 ( x − y ) + 5 2(x-y)+5 2(xy)+5
  5. d的初值
    d 0 = F ( 1 , R − 0.5 ) = 1 + ( R − 0.5 ) 2 − R 2 = 1.25 − R \begin{aligned} d_0 &= F(1, R-0.5)\\ &= 1 + (R-0.5)^2 - R^2\\ &= 1.25 - R \end{aligned} d0=F(1,R0.5)=1+(R0.5)2R2=1.25R

三、改进优化

为了摆脱 d 0 d_0 d0的浮点数运算,使整个算法全部使用整数运算,用 e 0 = d 0 − 0.25 e_0=d_0-0.25 e0=d00.25,则有 x 0 = 0 , y 0 = R , d 0 = 1 − R x_0=0,y_0=R,d_0=1-R x0=0,y0=R,d0=1R。那么,中点画圆算法的递推公式如下:( i = 0 , 1 , 2 , ⋯ i=0,1,2,\cdots i=0,1,2,,直至 x > y x>y x>y为止)
d < 0 , d i + 1 = d i + 2 x i + 3 , x i + 1 = x i + 1 d ≥ 0 , d i + 1 = d i + 2 ( x i − y i ) + 5 , x i + 1 = x i + 1 , y i + 1 = y i − 1 \begin{aligned} d &<0,d_{i+1}=d_i+2x_i+3,x_{i+1}=x_i+1\\ d &\geq0,d_{i+1}=d_i+2(x_i-y_i)+5,x_{i+1}=x_i +1,y_{i+1}=y_i-1 \end{aligned} dd<0,di+1=di+2xi+3,xi+1=xi+10,di+1=di+2(xiyi)+5,xi+1=xi+1,yi+1=yi1

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值