2011-09-10 28 views
1

我知道bressenham和相關算法,並且我找到了一個很好的算法來繪製一個具有1像素寬邊框的圓。是否有任何「標準」算法繪製一個具有n像素寬邊框的圓,而不恢復爲繪製n個圓?n像素邊框的圓形繪製算法

繪製像素和n^2個周圍的像素可能是一個解決方案,但它繪製比需要更多的像素。

我寫一個嵌入式系統中的圖形庫,所以我不是在尋找一種方式來做到這一點使用現有的庫中,雖然做這個功能是開源的可能是一個領先的庫。

+0

我知道這是很久以前的事了,但是你還記得你最終採取的方法嗎?我發現自己在嵌入式系統中處於相同的狀況。 –

+0

是不是很久啊?我從來沒有找到一個解決方案,足以滿足我的口味... –

回答

1

計算爲在同一時間一個八分兩個半徑點,並同時複製它八種方式,這是多麼布氏界通常反正繪製。爲了避免透支(例如XOR繪圖),第二個八分圓應該限制在第一個八分圓的x範圍之外。

請注意,如果線條與半徑相比非常厚,則此方法會崩潰。

+0

你有沒有試過這個?對於較小的寬度,會導致一個非常醜陋的圓圈。例如,對於寬度2,圓有時會是2,但有時是1像素的寬度。 –

+0

兩個寬度太小而不能產生好的結果。您需要使用至少三個寬度,最好是四個或五個寬度。對於非常小的厚度,繪製單個半徑並將像素拉伸至所需寬度(垂直於北/南八分圓,水平向東/西)可能會更好。否則,反鋸齒就是取得好成績的唯一途徑。 –

+0

我確實嘗試了拉伸方法,但結果很糟糕。你知道有哪些代碼可以實現保留和/或反走樣嗎? (抗鋸齒可以用1位b/w來表示) –

1

將它當作光柵化問題處理:

取出環的邊界框。 考慮圖像行落在邊界框中。 對於每一行,計算與2個圓的交點(即求解x^2 + y^2 = r^2,所以x = sqrt(r^2-y^2)圓心。 填寫跨度。重複下一行。

這種方法推廣到各種形狀,可產生對抗鋸齒的子像素座標有用的,比涉及多個移動哈克解決方案,提高分辨率縮放更好平局。

如果開方看上去很恐怖的嵌入式系統,牢記有快速近似算法,它很可能是不夠好,特別是如果你四捨五入至最近的像素。