基礎知識
在進行圓的轉換時,只要能生成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)2d1=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個,集合...