2010-06-11 35 views
9

我必須繪製一個像素的任意大小和方向的橢圓。繪製橢圓的主軸和副軸與x和y軸對齊似乎很容易,但將橢圓旋轉任意角度似乎更加棘手。最初,我雖然可能會繪製未旋轉的橢圓並將旋轉矩陣應用到每個點,但似乎可能會導致錯誤舍入,而且我需要相當高的精度。如何以像素爲單位繪製任意方向的橢圓?

我懷疑這種方法是否正確?我怎樣才能更準確地完成這項任務?

我在C++中編程(儘管這應該不重要,因爲這是一個更加面向算法的問題)。

編輯:正如大衛指出的,我想我可能真的想知道如何做像素插值。

回答

9

用途:

x = X cos(a) - Y sin(a) 
y = Y cos(a) + X sin(a) 

哪裏a是逆時針旋轉的角度,(x, y)是新座標,(X, Y)是舊的。

您應該使用浮動來保持精度。只要通過每一點,應用轉換,並voilà。

編輯:經過一番搜索之後,下面是來自微軟的一些代碼:http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html,它繪製了圓滑的圓錐形截面。

+1

我相信這將運行如常風險與「前進」轉換:混淆會導致您「跳過」轉換後的座標中的像素。 – dmckee 2010-06-11 19:18:27

+0

是的,這就是爲什麼我一直在尋找不同的方法。有沒有什麼好的方法來處理別名? – amc 2010-06-11 19:19:59

+0

是的,我的意思是,這一切都取決於你使用什麼庫來進行繪圖。但是,別名會導致任何類型的旋轉。你的問題應該是「我怎麼做像素插值?」 :) – 2010-06-11 19:20:55

1

使用Bresenham繪製軸對齊橢圓的方法,但對繪製的橢圓應用剪切。您還需要修改軸的長度。 A sheared ellipse is also an ellipse.該方法保留了Bresenham使用水平線段繪製填充橢圓的優勢。爲了做到這一點,您需要的是將橢圓的規格根據軸和旋轉映射到不同的軸和剪切集中的函數。一個解決方案是可在網上http://scratch.mit.edu/projects/50039326/有關的方法和討論在http://scratch.mit.edu/discuss/topic/94194/

一個description of the math involved是由Nathan斯莫爾發現的映射(用戶nXIII在MIT Scratch site

+0

這真了不起。應該是最好的答案,因爲它是一個新的,更好的解決舊問題的方法。 – tukra 2016-05-31 07:36:21