2010-05-26 194 views
2

我一直在尋找遍及Web的方法來繪製矩形座標中的橢圓,即左上角(x,y)和大小(寬度和高度)。我能找到的唯一的地方是基於Midpoint/Bresenham算法,我不能使用它,因爲使用整數像素時,我會失去精度,因爲這些算法使用中心點和徑向。從矩形中繪製橢圓

橢圓必須限於矩形的座標,所以如果我給它一個矩形,其寬度和高度是4(或任何偶數),我應該得到一個完全適合4x4矩形的橢圓,而不是一個將是5x5(就像那些算法給我的)。

有誰知道有什麼辦法可以做到這一點?

謝謝!

+0

只是要清楚,給出一個邊框,您希望通過框圍成的橢圓最大? – 2010-05-26 16:20:25

+0

這就是我想要的。 – 2010-05-26 16:42:45

回答

4

你不能得到寬度和高度(除以2)和矩形的中心,然後將它插入任何橢圓繪製例程作爲其主要,次要軸和中心?我想我在這裏一直沒有看到問題。

+0

不,我不能這樣做,因爲對於均勻的寬度和高度,所得到的橢圓的寬度和高度將從原始的像素增加一個像素,因爲它將像素繪製在中心+軸和中心軸上。我需要它完全在界限內,我的「像素」是32x32,所以這是非常明顯的。 – 2010-05-26 16:44:36

+0

所以這個問題是亞像素的準確性和反映關於象限導致一些邊緣覆蓋。鑑於此,你應該能夠存儲一個非整數寬度高度(或至少一個固定點值與1位分數)來處理這個問題。 然後問題是發現或編寫一個橢圓發生器,使用非整數寬度和高度。這不應該太難找到,但我沒有看起來可能不是這樣嗎? – 2010-05-26 17:12:33

0

我發現這個問題的解決方案是繪製具有奇數尺寸的最接近的較小橢圓,但沿着偶數長度維度將像素拉開,重複中間像素。

這可以很容易通過繪製每一個像素時使用不同的中間點的象限來完成:

DrawPixel(midX_high + x, midY_high + y); 
DrawPixel(midX_low - x, midY_high + y); 
DrawPixel(midX_high + x, midY_low - y); 
DrawPixel(midX_low - x, midY_low - y); 

高值是ceil'ed中點,和低的值是地板中點。

的圖像來說明,橢圓形寬度爲15和16:

ellipses