中點畫圓法詳解

中點畫圓法

一、算法原理

利用圓的對稱性,只須討論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}

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