2016-12-29 79 views
0

我得到了一個100px * 100px的圖像 要繪製一些實心的圓,並且隨機的位置和半徑。問題不是隨機的東西。 我只是不知道算法來定義像素上的位置(x,y)和半徑(r)的圓。通過算法定義一個圓圈

+2

3.請求作業幫助的問題必須包括您迄今爲止所做的工作的摘要以解決問題,並描述你正在解決它的困難。 –

回答

0

得到了它的答案: 中點畫圓算法

void drawcircle(int x0, int y0, int radius) 
{ 
int x = radius; 
int y = 0; 
int err = 0; 

while (x >= y) 
{ 
    putpixel(x0 + x, y0 + y); 
    putpixel(x0 + y, y0 + x); 
    putpixel(x0 - y, y0 + x); 
    putpixel(x0 - x, y0 + y); 
    putpixel(x0 - x, y0 - y); 
    putpixel(x0 - y, y0 - x); 
    putpixel(x0 + y, y0 - x); 
    putpixel(x0 + x, y0 - y); 

    if (err <= 0) 
    { 
     y += 1; 
     err += 2*y + 1; 
    } 
    if (err > 0) 
    { 
     x -= 1; 
     err -= 2*x + 1; 
    } 
} 
} 
+0

誠實並[引用正確](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm#C_EXAMPLE)。雖然知道什麼和在哪裏看是好事,但將副本作爲自己的「烹飪」呈現並不好。 –

0

必須應用公式應該從畢達哥拉斯得出:

r² = x²+y² 
r <= 50 

希望這是有意義的。

+0

r <= 50,而不是r^2 – vish4071

0

有上圓的邊緣剛好三點你可以找到圓的兩個中心半徑: 讓A, B, C是積分和a, b, c對應雙方哪些是(在2D情況下)

a = Sqrt((Bx - Cx) * (Bx - Cx) + (By - Cy) * (By - Cy)); 
b = Sqrt((Ax - Cx) * (Ax - Cx) + (Ay - Cy) * (Ay - Cy)); 
c = Sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay));  

然後半徑R

R = a * b * c/Sqrt((a+b+c)*(b+c-a)*(c+a-b)*(a+b-c)); 

接下來,讓

d = (a*a*(b*b+c*c-a*a) + b*b*(c*c+a*a-b*b) + c*c*(a*a+b*b-c*c)) 

中心K

K = (a*a*(b*b+c*c-a*a)*A + b*b*(c*c+a*a-b*b)*B + c*c*(a*a+b*b-c*c)*C)/d 

哈詠兩個半徑和中心,您可以用圓的方程到圓中定義的所有點(2D情況下):

(Kx - x) * (Kx - x) + (Ky - y) * (Ky - y) <= R * R 

最後

  1. 檢測邊緣
  2. 採取一個邊緣三點,找到圓圈
  3. 驗證(特別是,如果圓圈彼此交叉)
+0

看起來很複雜,容易出錯(3個共線點的特殊情況,矩形不完全包含的圓圈)和CPU重(大量sqroots和特殊驗證)爲什麼?我錯過了什麼? (更容易產生一個隨機半徑,然後一箇中心,你知道將使圓包含完全由邊界矩) –

+0

@Adrian Colomitchi:'Math.Sqrt'只是一個'FSQRT'命令在FPU上,因此它不是CPU-沉重(每圈只有*四*平方根)。共線點特例容易避免;如果您不希望縮小到像素,則可以跳過大部分驗證(如果您有跨越圓圈,噪聲圖片等,則需要這些驗證)。想象一下,你有一箇舊的破碎的唱片記錄的圖片,你想重建它的原始視圖(我必須解決的問題) - 邊緣,三角形,圓圈,驗證;最後是最可能的周長。 –