圓的生成演算法

2021-04-02 20:10:07 字數 2248 閱讀 6290

基礎知識

在進行圓的轉換時,只要能生成8分圓,那麼圓的其它部分可通過一系列的簡單反射變換得到。本小節介紹一種常用的畫圓演算法:bresenham畫圓演算法。

bresenham演算法:不失一般性,考慮圓心在原點,半徑為r的第乙個4分圓。取(0,r)為起點,按順時針方向生成圓。從這段圓弧的任意一點出發,按順時針方向生成圓時,為了最佳逼近該圓,下一象素的取法只要三種可能的選擇:正右方象素,右下方象素和正下方象素。

xi+1=xi+1

相應的

yi+1

則在兩種可能中選擇:

yi+1=yi

,或者yi+1=yi-1

選擇的原則是考察精確值

y靠近yi還是靠近yi-1(圖1

),計算式為

y2=r2-(xi+1)2

d1=yi

2-y2

=yi

2-r2+(xi+1)2

d2=y2-(yi-1)2

=r2-(xi+1)2-(yi-1)2

圖1

令pi=d1-d2,並代入d1, d2,則有

pi=2(xi+1)2+yi2+(yi-1)2-2r2 (2.2.1)

pi稱為誤差。如果pi<0則yi+1=yi,否則yi+1=yi-1。pi的遞迴式為:

pi+1=pi+4xi+6+2(yi2+1-yi2)-2(yi+1-yi) (2.2.2)

pi的初值由式(2.6)代入xi=0, yi=r而得

p1=3-2r (2.2.3)

根據上面的推導,圓周生成演算法思想為:

1、求誤差初值,p1=3-2r; i=1;畫點(0, r);

2、求下乙個光柵位置:

xi+1=xi+1;

if pi<0 則yi+1=yi;

否則yi+1=yi-1;

3、畫點(xi+1, yi+1)

4、計算下乙個誤差:

if pi<0 則pi+1=pi+4xi+6;

否則 pi+1=pi+4(xi-yi)+10;

5、i=i+1; if x=y則end;否則返2。

雖然式(2.2.2)式表示pi+1的演算法似乎很複雜,但因為yi+1只能取值yi或yi-1,因此在演算法中,第4步的算式變得很簡單,只須作加法和4的乘法。因此圓的bresenham演算法執行速度也是很快的,並適宜於硬體實現。

圓的bresenham演算法的程式實現見程式2.2.1。

circle (xc, yc, radius, c)

int xc, yc, radius, c;

x+=1;

}

if (x= =y)

plot_circle_points(xc, yc, x, y, c);

}

plot_circle_points(xc, yc, x, y, c)

int xc, yc, x, y, c;

bresenham的圓生成演算法

設圓之半徑為r。先考慮圓心在(0,0),並從x=0, y=r開始的順時針方向的1/8圓周的生成過程。在這種情況下,x每步增加1,從x=0開始,到x=y結束。即有:

給出圓心座標

xc, yc,和半徑r,逐點畫出乙個圓周的公式有下列兩種:

1、直角座標法:

(x-xc)2+(y-yc)2=r2

由上式匯出

y= 當

x-xc從-r到r作加1遞增時,就可以求出對應的圓周點的y座標。但是這樣求出的圓周上的點是不均勻的;|x-xc|越大,對應生成圓周點之間的圓周距離也就越長。因此,所生成的圓不美觀。

.2、極座標法:

x=xc+r·cosθ

y=yc+r·sinθ

當θ 從0 度到360 作加1遞增時,由此式便可求出圓周上均勻分布的360個點的x, y座標。利用圓周座標的對稱性,此演算法還可以簡化:將圓周分為8個象限(圖2.2.1)。只要將第1a象限中的圓周光柵點求出,其餘7部分圓周就可以通過對稱法則計算出來。圖2.2.1給出了圓心在0,0

點時的對稱變換法則。但即使作了如此簡化,用上述公式每算一點,都要經過三角函式計算,仍有相當大的計算量。

圖2.2.1 圓心在0,0點圓周生成時的對稱變換

在計算機中上述兩個公式所示的方法生成圓周都頗費時,下面介紹的演算法則要簡捷得多。

3.圓的bresenham演算法

CART生成演算法

輸入 訓練資料集 d 停止計算的條件 輸出 cart 決策樹。根據訓練資料集,從根結點開始,遞迴地對每個結點進行以下操作,構造二叉決策樹 1 設結點的訓練資料集為 d 計算現有特徵對該資料集的基尼指數。此時,對每乙個特徵 a,對其可能取得每個值 a 根據樣本點對 a a的測試為 是 或 否 將 d ...

子集生成演算法

劉汝佳書上的內容 下文提到的集合 其元素預設為0 n 1 n 個 意思就是一次選乙個 放到 裡 include include include include include include include include include include include include includ...

子集生成演算法

子集生成演算法屬於暴力法中一類非常重要的演算法.給定乙個集合,請寫乙個演算法,得到其所有的子集.這裡假定該集合不存在重複的元素.舉個栗子,給定集合 1,2,3 你返回這樣一堆子集 1 2 3 1,2 1,3 2,3 1,2,3 根據離散數學的知識,我們可以知道,乙個長度為n的集合的子集有2n個,集合...