中点画圆法详解

中点画圆法

一、算法原理

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

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

二、公式推导

  1. 构造函数:F(x,y)=x^2 + y ^2 - R^2$ ,则有:
    Fx,y=0x,yFx,y<0x,yFx,y>0x,y F(x,y)= 0 (x,y)在圆上\\ F(x,y)< 0 (x,y)在圆内\\ F(x,y)> 0 (x,y)在圆外
  2. 带入MM座标,有如下结论:
    FM<0F(M)< 0 M在圆内,取P1P_1
    FM0F(M)\geq 0 M在圆外,取P2P_2
    为此,可采用如下判别式:
    d=F(M)=F(x+1,y0.5)=(x+1)2+(y0.5)2R2 \begin{aligned} d &= F(M) \\ &= F(x + 1, y - 0.5)\\ &= (x + 1)^2 + (y - 0.5) ^2 - R^2 \end{aligned}
  3. d<0d<0,则P1P_1 为下一个像素,那么再下一个像素的判别式为:
    d1=F(x+2,y0.5)=(x+2)2+(y0.5)2R2=d+2x+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}
    即,dd的增量为2x+32x +3
  4. d0d \geq 0,则P2P_2 为下一个像素,那么再下一个像素的判别式为:
    d2=F(x+2,y1.5)=(x+2)2+(y1.5)2R2=d+(2x+3)+(2y+2)=d+2(xy)+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}
    即,dd的增量为2(xy)+52(x-y)+5
  5. d的初值
    d0=F(1,R0.5)=1+(R0.5)2R2=1.25R \begin{aligned} d_0 &= F(1, R-0.5)\\ &= 1 + (R-0.5)^2 - R^2\\ &= 1.25 - R \end{aligned}

三、改进优化

为了摆脱d0d_0的浮点数运算,使整个算法全部使用整数运算,用e0=d00.25e_0=d_0-0.25,则有x0=0,y0=R,d0=1Rx_0=0,y_0=R,d_0=1-R。那么,中点画圆算法的递推公式如下:(i=0,1,2,i=0,1,2,\cdots,直至x>yx>y为止)
d<0,di+1=di+2xi+3,xi+1=xi+1d0,di+1=di+2(xiyi)+5,xi+1=xi+1,yi+1=yi1 \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}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章