當其半徑爲整數時,midpoint circle algorithm非常適合計算圓。什麼算法用於計算具有浮點半徑的圓?
void CircleOptimized(int xc, int yc, int r, int color) {
unsigned int x= r, y= 0;//local coords
int cd2= 0; //current distance squared - radius squared
if (!r) return;
drawpixel(xc-r, yc, color);
drawpixel(xc+r, yc, color);
drawpixel(xc, yc-r, color);
drawpixel(xc, yc+r, color);
while (x > y) { //only formulate 1/8 of circle
cd2-= (--x) - (++y);
if (cd2 < 0) cd2+=x++;
drawpixel(xc-x, yc-y, color);//upper left left
drawpixel(xc-y, yc-x, color);//upper upper left
drawpixel(xc+y, yc-x, color);//upper upper right
drawpixel(xc+x, yc-y, color);//upper right right
drawpixel(xc-x, yc+y, color);//lower left left
drawpixel(xc-y, yc+x, color);//lower lower left
drawpixel(xc+y, yc+x, color);//lower lower right
drawpixel(xc+x, yc+y, color);//lower right right
}
}
例如,通過r=1
時和r=2
的輸出分別被如下:
..... .XXX.
..X.. X...X
.X.X. X...X
..X.. X...X
..... .XXX.
r=1 r=2
然而,我需要r=1
和r=2
之間的幾個步驟。也許,(假設)r=1.33
和r=1.66
這可能是這樣的:
..... ..... ..X.. .XXX.
..X.. .XXX. .X.X. X...X
.X.X. .X.X. X...X X...X
..X.. .XXX. .X.X. X...X
..... ..... ..X.. .XXX.
r=1.0 r=1.3 r=1.6 r=2.0
然而,當我試着去適應上述算法使用浮點運算(使用或不四捨五入),它失去了它的對稱性,併產生不連續的路徑(導致一些非常奇怪的形狀)。
有沒有更適合我的目的的算法?
所以,你問爲什麼你不*顯示的代碼版本不起作用?在這裏看到任何問題? ;-) – hyde
無論如何,這整個算法是基於整數算術。可以使用具有縮放的整數,也可以使用圓的基本* sin *和* cos *公式。 – hyde
@hyde複製和粘貼代碼塊代替'float',然後再添加一個'round'複製並粘貼,看起來非常簡單。 –