我得到了一個100px * 100px的圖像 要繪製一些實心的圓,並且隨機的位置和半徑。問題不是隨機的東西。 我只是不知道算法來定義像素上的位置(x,y)和半徑(r)的圓。通過算法定義一個圓圈
回答
得到了它的答案: 中點畫圓算法
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;
}
}
}
誠實並[引用正確](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm#C_EXAMPLE)。雖然知道什麼和在哪裏看是好事,但將副本作爲自己的「烹飪」呈現並不好。 –
有上圓的邊緣剛好三點你可以找到圓的兩個中心和半徑: 讓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
最後
- 檢測邊緣
- 採取一個邊緣三點,找到圓圈
- 驗證(特別是,如果圓圈彼此交叉)
看起來很複雜,容易出錯(3個共線點的特殊情況,矩形不完全包含的圓圈)和CPU重(大量sqroots和特殊驗證)爲什麼?我錯過了什麼? (更容易產生一個隨機半徑,然後一箇中心,你知道將使圓包含完全由邊界矩) –
@Adrian Colomitchi:'Math.Sqrt'只是一個'FSQRT'命令在FPU上,因此它不是CPU-沉重(每圈只有*四*平方根)。共線點特例容易避免;如果您不希望縮小到像素,則可以跳過大部分驗證(如果您有跨越圓圈,噪聲圖片等,則需要這些驗證)。想象一下,你有一箇舊的破碎的唱片記錄的圖片,你想重建它的原始視圖(我必須解決的問題) - 邊緣,三角形,圓圈,驗證;最後是最可能的周長。 –
- 1. 計算在一個圓圈
- 2. 自定義JLabel繪製一個圓圈
- 3. 圓圈堆碼算法
- 4. 在圓圈內打圈的算法?
- 5. 通過畫一個圓圈在谷歌地圖上選擇自定義標記
- 6. 控制D3圓圈包佈局算法中圓圈的順序
- 7. 通過2個已知點和角度在一個點上計算圓圈
- 8. 尋找一個圓圈是否在另一個圓圈內
- 9. 圍繞一個大圓圈移動一個小圓圈
- 10. 算法一圈
- 11. Python - 在計算對象時移除另一個圓圈內的圓圈
- 12. D3圓圈包佈局算法
- 13. 多圈圓碰撞的算法
- 14. GL_TRIANGLE_FAN畫一個圓圈
- 15. 畫一個圓圈像素
- 16. D3帶上一個圓圈?
- 17. 畫一個彩色圓圈
- 18. Win32 GDI畫一個圓圈?
- 19. 如何在一個圓圈
- 20. 通過兩點繪製精確圓圈
- 21. android - 如何定義一個圓圈內的可觸摸區域
- 22. CSS:位置圓(LI)成一個圓圈
- 23. Android自定義ViewGroup繪製圓圈行
- 24. 使用正弦和餘弦將圓圈定位在一個圓圈中
- 25. cv:圓圈函數用一次調用繪製多個圓圈
- 26. 在距離10處的圓圈內畫一個圓圈
- 27. 創建一個由小圓圈組成的擴展圓圈
- 28. 檢查另一個圓圈是否包含圓圈
- 29. 爲什麼畫布圓圈看起來不像一個圓圈?
- 30. 如何在WPF中創建一個帶圓圈的圓圈?
3.請求作業幫助的問題必須包括您迄今爲止所做的工作的摘要以解決問題,並描述你正在解決它的困難。 –